0

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

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

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

  1. 按照文件格式创建位图标题。我不确定是否所有 bmp 版本(1 位、8 位等)都具有相同的标头格式。找不到任何相关信息。
  2. 遍历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?
    }
    
  3. 将这些位附加到您已经创建的 bmp 标头中。

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

4

1 回答 1

1

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

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

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

维基百科的文章信息量很大。所有 BMP 类型的 header 格式基本相同,bitdepth 存储在 offset 中1Ch

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

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

但我不知道如何处理位

只需将一组八位封装在一个字节中。

于 2013-02-27T16:49:08.707 回答