在.Net 2.0中将8位灰度tiff图像转换为8位灰度jpg

3
我们有一个系统,提供8位灰度的图像,可以是tiff或jpg格式。但是,我们处理图像的组件期望图像以8位jpg格式提供。
当我使用.Net将tiff图像保存为jpg时,它会将其转换为24位图像。
有没有一种方法,最好是简单且快速的方式,将8位灰度tiff图像转换为等效的jpg?

非常晦涩,GDI+不支持它。尝试使用带有BitmapPalettes.Gray256调色板的JpegBitmapEncoder类。 - Hans Passant
@ChrisF,我不是jpg专家,但这是Windows和IrfanView告诉我的。例如,如果我查看jpg文件的属性,我会看到位深度为8。我会看看是否可以在某个地方上传示例图片。 - TheBlueSky
@HansPassant,我不知道您建议的解决方案是否有效,但不幸的是我使用的是不支持BitmapPalettes.Gray256的.Net 2.0。 - TheBlueSky
1
@HansPassant,我们都可以幻想每个人都是最新的,并且不需要支持“旧”技术,或者我们可以看看现实生活有多么不同。那么,“为什么程序员会陷入一个8年前的代码中”呢?因为你的客户要求如此;你不能仅仅为了升级而升级一个正常运行的系统。这是“过于局限”吗?我认为不是。.Net 2.0是广泛使用且仍然完全支持的框架。如果你等着它消亡,请听取我的建议,别屏住呼吸;我猜你至少要再等上2年。 - TheBlueSky
2.0版本的安装程序在3个月前已从微软下载服务中移除。 - Hans Passant
显示剩余5条评论
2个回答

2
我试了很多次才得出结论:抱歉,.Net库的Bitmap类即使明确指定数据为灰度图像且数据是8bpp,也无法将JPEG保存为8bpp。
(注意:尽管在某些地方已经说明,JPEG格式确实支持8bpp。)
将图像转换为灰度中,您可以找到将任何图像转换为灰度的代码片段。
使用该代码,我能够将带有“.jpeg”扩展名的8bpp灰度图像实例保存下来,但要声明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/ 祝好运!

0
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;
}

ColorDepth在ImageFormat.Jpeg下无法被Image.Save遵守...尽管优雅而简单,但这段代码并不起作用。 - Marcus Vinicius Pompeu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接