使用 Libpng 创建 2 位颜色深度的 PNG 图像

Posted

技术标签:

【中文标题】使用 Libpng 创建 2 位颜色深度的 PNG 图像【英文标题】:Creating 2bits color depth PNG images with Libpng 【发布时间】:2013-01-30 09:16:28 【问题描述】:

我想使用 Libpng 库生成 1 位(2 种颜色)或 2 位(4 种颜色)深度的 PNG 图像。

有人知道怎么做吗?我已经测试了示例,它们似乎都适用于 8 位色深?

我知道 png_set_IHDR 但在我测试的示例中,当我将 png_set_IHDR 中的深度参数从 8 更改为 2 或 1 时,我的程序会绘制 2 或 4 的一个像素。我认为,这是由于使用png_malloc 函数。

在我尝试修改的示例中(http://www.lemoda.net/c/write-png/),png_malloc 函数将图像的所有像素分配为 sizeof uint8_t。

png_malloc (png_ptr, sizeof (uint8_t) * bitmap->width * pixel_size);

你能告诉我如何分配 1bit 或 2bits 像素吗?

谢谢 乔2s

【问题讨论】:

直接使用png_set_IHDR,位深为1或2,还需要什么? 【参考方案1】:

在 png_set_IHDR 中,bit_depth 参数设置所有颜色分量的位深度。与 PNG_COLOR_TYPE_RGB 一起,您最终会得到红色分量的一位,绿色分量的一位,蓝色分量的一位。

你应该用PNG_COLOR_TYPE_PALETTE调用png_set_IHDR,然后如果bit_depth是1,你必须有一个调色板有两种颜色(0和1),如果bit_depth是2,一个有四种颜色(0到3)。

【讨论】:

对于 PNG_COLOR_TYPE_RGB,PNG 规范只允许位深 8 和 16。所以是的,你应该像安德烈说的那样使用 PNG_COLOR_TYPE_PALETTE。

以上是关于使用 Libpng 创建 2 位颜色深度的 PNG 图像的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 libpng 库获取 16 位深度的灰度图像的像素值?

16位灰度png

png图片,背景替换成无颜色背景

使用 libpng 过滤器

使用 libpng 将位图缓冲区快速编码为 png

使用 C++、libpng 和 OpenMP 并行创建 PNG 文件