iOS:将 png 图像转换为 1 位 bmp 图像

Posted

技术标签:

【中文标题】iOS:将 png 图像转换为 1 位 bmp 图像【英文标题】:iOS : converting png image to 1 bit bmp images 【发布时间】:2013-02-27 11:12:57 【问题描述】:

我的要求是将 png 文件转换为 1 位单色位图文件。我有一个 UIImage 对象,我想将其表示为 1 位单色 bmp。

1) 有没有直接的方法可以做到这一点?我准备从头开始做这件事,但前提是没有任何现成的解决方案可用。我浏览了 Core graphics 和 Core image framework,但找不到任何相关的东西。或者是否有任何可用的开源项目可以实现这一点?

2) 如果我必须手动执行此操作,我对保存像素的位表示存在一些疑问。我找到了 bmp 文件格式here。

    按照文件格式创建位图标题。我不确定 所有 bmp 版本(1 位、8 位等)是否具有相同的标头格式。 找不到任何相关信息。

    遍历png图像的所有像素,得到字节值 红、绿、蓝 (RGB)。对这 3 个值进行一些计算,以 获得 1 位表示。例如像(伪代码)

    for(each pixel)
        average  = (pixel.RValue + pixel.GValue + pixel.BValue)/3;
        if(average > 0x7f) //127
             bit  = 1;
        else
             bit  = 0;
        //bit has monochrome representation for this pixel, but how to store it?
    
    
    将这些位附加到您已经创建的 bmp 标头中。

我知道如何遍历 png 图像中的每个像素,因此我可以获得该像素的单色表示。我也认为我可以做标题部分,即使我还没有做过。但我不知道如何处理位。有什么帮助吗?

【问题讨论】:

您可能希望使用亮度值进行转换。 RGB 亮度不相等。 Y = 0.2126R + 0.7152G + 0.0722B en.wikipedia.org/wiki/Relative_luminance 【参考方案1】:

有没有直接的方法来做到这一点?我准备从头开始做这件事,但前提是没有任何现成的解决方案可用。

我无法告诉你是否有现成的解决方案可以在 ios 中编写 BMP,但我可以告诉你,BMP 是少数几种相对容易从头开始编写的格式之一。

按照文件格式创建位图标题。我不确定是否所有 bmp 版本(1 位、8 位等)都具有相同的标头格式。找不到任何相关信息。

***的文章内容丰富。所有BMP类型的header格式基本相同,bitdepth存储在offset1Ch

遍历png图像的所有像素,得到红、绿、蓝(RGB)的字节值。对这 3 个值进行一些计算,以获得 1 位表示。例如...将这些位附加到您已经创建的 bmp 标头中。

听起来不错。不要忘记行可能需要一些 padding

但我不知道如何处理比特

简单打包eight bits in one byte的组。

【讨论】:

以上是关于iOS:将 png 图像转换为 1 位 bmp 图像的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C++ 中将图像从 .bmp 转换为 .png

ImageMagick:无法将24位bmp图像转换为8位bmp图像

Ico 格式 - 32 位 PNG 与 32 位 BMP 与 24 位 BMP

将多个 png 转换为 bmp 从标准输入到标准输出

如何将 PNG 图像转换为 SVG? [关闭]

java图像上传中如何判断是不是是jpg格式