我需要将24bppRGB转换为16bppRGB,8bppRGB,4bppRGB,8bpp灰度和4bpp灰度。有什么好的链接或其他建议吗?
最好使用Windows / GDI +
[编辑]速度比质量更重要。源图像是截图 需要[EDIT1]颜色转换以最小化空间
答案 0 :(得分:3)
正如其他人所建议的那样,你最好让自己成为一个图书馆。除了ImageMagick,还有其他一些,例如OpenCV。将其留给图书馆的好处是:
如果您自己这样做,那么您的问题可以分为以下子问题:
通过这种细分,你可以分而治之。问题1和2你可以很快解决。通过粗略的颜色量化,您可以看到质量。
您是否要解决问题2将取决于上述结果。你说速度更重要,所以如果颜色量化的质量只是足够好,不要打扰货盘化。
最后,您从未提及为什么您正在这样做。如果这是为了减少存储空间,那么您应该查看image compression。即使是无损压缩也会比单独减少颜色深度给出更好的结果。
修改强>
如果您开始使用PNG作为最终格式,那么您的选项为quite limited,因为RGB16和RGB8在PNG header中都不是有效组合。
所以这意味着:无论位深度如何,如果想要RGB色彩图像低于24bpp(每通道8位),您将 切换到索引颜色。这意味着你 NOT 能够利用我上面提到的颜色量化和色度抽取 - 它在PNG中不受支持。所以这意味着你将 来解决问题2 - 货盘化。
但在你考虑之前,还有一些问题:
您的图片来源是什么?你已经提到了屏幕截图,但由于你非常担心磁盘空间,我开始怀疑你可能正在处理图像序列(视频)。如果是这样,那么你可以做得比PNG压缩更好。
哦,如果你真的想用PNG做事,那么一定要看看this library。
答案 1 :(得分:1)
找到你自己的ImageMagick [sic]库的副本。它是非常可配置的,因此您可以教它有关您需要处理的某些二进制格式的详细信息......
答案 2 :(得分:1)
请参阅:ImageMagick,它具有非常实用的许可证。
答案 3 :(得分:0)
我通过Vista和Win7附带的GDI +,v.1.1获得了可接受的结果(初步)。它使用标准调色板allows conversion到16bpp
(我使用PixelFormat16bppRGB565
)和8bpp
和4bpp
。 “最佳调色板”可以获得更好的质量--GDI +将为每个屏幕截图计算最佳调色板,但转换速度要慢两倍。通过指定简单的自定义调色板,例如,收到灰度。如展示here,除了我不需要手动修改像素,Bitmap::ConvertFormat()
为我做了。
[EDIT]结果真的可以接受,直到我决定在WinXP上检查解决方案。令人惊讶的是,微软决定不向WinXP发送GDI + v.1.1(Bitmap::ConvertFormat
所需)。好身手!所以我继续研究......
[EDIT]不得不重新实现GDI +上的干净GDI硬编码调色板