画像を 8 ビット グレースケールの tiff または jpg 形式で提供するシステムがあります。ただし、画像を処理する必要があるコンポーネントは、画像が 8 ビットの jpg 形式であることを想定しています。
.Net を使用して tiff 画像を jpg として保存すると、24 ビット画像に変換されます。
8 ビットのグレースケール tiff 画像を同等の jpg に変換する方法はありますか?
画像を 8 ビット グレースケールの tiff または jpg 形式で提供するシステムがあります。ただし、画像を処理する必要があるコンポーネントは、画像が 8 ビットの jpg 形式であることを想定しています。
.Net を使用して tiff 画像を jpg として保存すると、24 ビット画像に変換されます。
8 ビットのグレースケール tiff 画像を同等の jpg に変換する方法はありますか?
申し訳ありませんが、.Net ライブラリの Bitmap クラスは、明示的に指定されていて、データがグレースケールであっても、JPEG を 8bpp として保存しません。
(注: いくつかの場所で述べられていますが、JPEG 形式は 8bpp をサポートしています)。
画像をグレースケールに変換すると、任意の画像をグレースケールに変換するためのコード スニペットが見つかる場合があります。
そのコードを使用して、8bpp グレースケール イメージ インスタンスを「.jpeg」拡張子で保存できましたが、ImageFormat.Gif を記述しています...これはチートです...
私の調査結果は、解決策としてまったく異なるアプローチを示しています。
FreeImage ライブラリは、問題を解決するために必要な機能を含む強力な API を提供します。
ホームページはhttp://freeimage.sourceforge.net/faq.htmlにあります
しかし、Win2008 + VS 2010 マシンでは簡単にコンパイルできませんでした。
現代の環境で実行するには、多くの汗をかく必要があります。
それを達成する方法に関するいくつかのヒントは、http://www.sambeauvois.be/blog/2010/05/freeimage-and-x64-projects-yes-you-can/にあります。
幸運を!
Image img = Image.FromFile(filePathOriginal);
Bitmap bmp = ConvertTo8bpp(img);
EncoderParameters parameters = new EncoderParameters();
parameters.Param[0] = new EncoderParameter(Encoder.ColorDepth, 8);
bmp.Save(filePathNew, jpgCodec, parameters);
bmp.Dispose();
img.Dispose();
...
private static Bitmap ConvertTo8bpp(Image img) {
var bmp = new Bitmap(img.Width, img.Height, System.Drawing.Imaging.PixelFormat.Format8bppIndexed);
using (var gr = Graphics.FromImage(bmp))
{
gr.DrawImage(img, new Rectangle(0, 0, img.Width, img.Height));
}
return bmp;
}