首页 > 解决方案 > 编写未压缩的JPEG或PNG图像的简单方法?

问题描述

我在内存中有一个原始图像,组织为一个 32 位 RGB 值的数组。我想尽快将其写入图像文件,以便释放内存。有没有办法执行以下操作来编写未压缩的 JPEG、PNG 或 TIFF 图像?或者我应该说,哪些图像格式与这种写入原始像素数据的方法兼容?请注意,左上角的像素位于像素数据的前 4 个字节中。

void write_image(uint32_t *pixels, int width, int height) {
 FILE *file=fopen("file.jpg","wb");
 write_header (file, width, height);
 fwrite (pixels,1,width*height*4,file); // write raw pixel data
 write_end (file);
 fclose(file);
}

标签: cimagepngjpegtiff

解决方案


您似乎有两个不同的问题或动机。

首先,希望以某种未压缩格式写入图像以(可能)提高速度。PNG 和 JPEG 是压缩格式,尽管您可以指示编码器(至少在某些 PNG 实现中)使用“无压缩”设置。

但是:a)在少数情况下,“优化”会产生重大影响,普通压缩器非常快。

b) 即使在使用某些compression_level=0设置进行编码时,您仍在以特定格式(通常是标题,开始时)对图像进行编码。是什么让我们想到了第二个动机。

其次,您似乎不想完全(仅)避免压缩,而是避免编码。也就是说,您想以未编码(“原始”)格式写入像素。当然,在这种情况下,您不能编写 PNG 或 JPEG 图像。您可以使用自己的或某些标准 RAW 格式,或准原始BMP格式。但是您仍然需要注意像素在内存中的组织方式(例如,每个通道一个字节?RGB?BGR?RGBA ?)也许还有其他一些问题(例如,BMP 要求每行的字节数是4)。


推荐阅读