【问题标题】:Converting 8-bit grayscale tiff image to 8-bit grayscale jpg in .Net 2.0在.Net 2.0中将8位灰度tiff图像转换为8位灰度jpg
【发布时间】:2013-01-06 21:32:51
【问题描述】:

我们有一个系统可以提供 8 位灰度图像,无论是 tiff 还是 jpg 格式。但是,我们必须处理图像的组件要求图像为 8 位 jpg 格式。

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

有没有一种方法可以简单快速地将 8 位灰度 tiff 图像转换为等效的 jpg?

【问题讨论】:

  • 你有一些目标组件可以接受的示例 jpg 文件吗?我怀疑它们也是 24 位图像(jpg 的标准),但每个红色、绿色和蓝色通道都将保存相同的数据。
  • 非常晦涩,GDI+ 不支持。尝试使用带有 BitmapPalettes.Gray256 调色板的 JpegBitmapEncoder 类。
  • @ChrisF,我不是 jpg 专家,但这是 Windows 和 IrfanView 告诉我的。例如,如果我查看 jpg 文件的属性,我看到位深度是 8。我会看看我是否可以在某处上传示例图片。
  • @HansPassant,我不知道您建议的解决方案是否有效,但不幸的是我使用不支持BitmapPalettes.Gray256 的.Net 2.0。
  • @HansPassant,我们都可以幻想每个人都是最新的,不需要支持“旧”技术,或者我们可以看看现实生活,看看它有多么不同.那么,“为什么程序员会卡在一段 8 年前的代码上”?因为你的客户这么说;你不能仅仅为了升级一个工作系统而升级它。是否“过于本地化”?我不这么认为。 .Net 2.0 被广泛使用并且仍然完全受支持的框架。如果你在等它死去,请听我的建议,不要屏住呼吸;从今天起,我猜你会等不少于 2 年。

标签: .net image-processing .net-2.0


【解决方案1】:

我试图并试图得出结论,我很抱歉:.Net 库的位图类不会将 JPEG 保存为 8bpp,即使明确说明并且数据为灰度。

(注意:虽然有些地方有说明,但 JPEG 格式确实支持 8bpp)。

Convert an image to grayscale,您可以找到将任何图像转换为灰度的代码片段。

使用该代码,我能够保存一个带有“.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/可以找到一些关于如何完成的提示

祝你好运!

【讨论】:

    【解决方案2】:
    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;
    }
    

    【讨论】:

    • Image.Save for ImageFormat.Jpeg 不遵守 ColorDepth...虽然优雅而直接,但此代码不起作用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-16
    • 2020-05-07
    • 2012-03-30
    相关资源
    最近更新 更多