現在、非常に大きな画像を処理していますが、基本的にはパノラマやフォトモザイクなどの小さな画像を多数つなぎ合わせて生成します。メモリ不足の例外を防ぐために、小さな画像を整理する方法の「マップ」だけがメモリです)、BinaryWriterとLockBitsを使ってビットマップとしてこれらの画像を1行ずつ保存するコードを書きました。ここまでは順調ですね。c#非常に大きなビットマップをjpegs(または他の圧縮形式)として保存する
問題は、これらの画像をJpeg(またはPNG)として保存することになりました。私はかなり新しいので、私は今のところ2つの方法しか考えることができません。
1)ビットマップ保存手順と似ています。いくつかのjpegヘッダーを生成し、大きなイメージを1行ずつ保存し、前に何らかの形でそれらを圧縮します。私はどのように圧縮を実行するか分かりません。
2)すでに保存されているビットマップをメモリにストリーミングし、エンコードされたjpegとして保存します。
FileStream fsr =
new FileStream("input.bmp", FileMode.Open, FileAccess.Read);
FileStream fsw =
new FileStream("output.jpg", FileMode.CreateNew, FileAccess.Write);
EncoderParameters encoderParameters = new EncoderParameters(1);
encoderParameters.Param[0] =
new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 80L);
Bitmap bmp = new Bitmap(fsr);
bmp.Save(fsw, GetEncoder(ImageFormat.Jpeg), encoderParameters);
bmp.Dispose();
問題はメモリ不足を引き起こし、保存法が完全に最初のメモリにビットマップをロードしようということになりました。第二のアプローチは容易に見えたので
は、私はこのような何かを試してみました例外。
私は、この問題を解決する方法や迂回する方法に関する提案に満足しています。
OutOfMemoryException - この日および年齢ではありませんか?あなたのビットマップの大きさはどれくらいですか? – zmbq
はい、あなたは簡単にメモリの問題に遭遇することができます。私は適切に処分していたとしても、約10Kのイメージのサイズを変更して、 'OutOfMemoryException'に頻繁に走っていました。 – DarthVader
ビットマップからのOOMは非常に疑わしいです。このクラスは、悪いパラメータなどを含む間違ったものについてメモリ例外をスローします。 –