2013-01-23 204 views
3

我们有一个系统可提供8位灰度tiff或jpg格式的图像。但是,我们必须处理图像的组件需要图像为8位jpg格式。在.Net 2.0中将8位灰度tiff图像转换为8位灰度jpg

当我使用.Net将tiff图像保存为jpg格式时,它将它转换为24位图像。

有没有一种方法,希望简单和快速,将8位灰度tiff图像转换为相应的JPG格式?

+0

您是否有一些目标组件可以接受的示例jpg文件?我怀疑它们也是24位图像(jpg的标准),但红色,绿色和蓝色通道中的每一个都会保存相同的数据。 – ChrisF

+0

非常隐晦,GDI +不支持它。尝试使用BitmapPalettes.Gray256调色板的JpegBitmapEncoder类。 –

+0

@ChrisF,我不是jpg专家,但这是Windows和IrfanView告诉我的。例如,如果我查看jpg文件的属性,则会看到位深度为8.我会看看是否可以在某处上传示例图片。 – TheBlueSky

回答

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

ColorDepth不受Image.Save for ImageFormat.Jpeg ...虽然优雅和直接,但此代码不起作用。 –

1

我试了又试只是为了得出结论,我很抱歉:NET库的Bitmap类DOES NOT JPEG保存为8bpp的,即使明确说明和数据是在灰度。 (注:虽然在某些地方声明,JPEG格式DOES支持8bpp)。

Convert an image to grayscale你可能会发现代码snipet转换为灰度任何图像。

使用的代码,我才得以保存“.JPEG”扩展名的8bpp的灰度图像的实例,但指出ImageFormat.Gif ...这是个骗子......

我的研究结果表明作为解决方案完全不同的方法。

FreeImage库提供了强大的API,包括解决您的问题所需的功能。

它的主页是http://freeimage.sourceforge.net/faq.html

不过,我是不会轻易编译它在我的Win2008 + VS 2010的机器。

一个人应该汗流to背,才能在现代环境中运行。

就如何实现这一目标的一些提示在http://www.sambeauvois.be/blog/2010/05/freeimage-and-x64-projects-yes-you-can/

好运发现!

相关问题