编写未压缩的 JPEG 或 PNG 图像的简单方法?

xyz*_*xyz 8 c png jpeg tiff image

我在内存中有一个原始图像,组织为 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);
}
Run Code Online (Sandbox Code Playgroud)

leo*_*loy 3

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

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

然而:a)很少有“优化”会产生重大影响的情况,普通压缩器速度相当快。

b) 即使使用某些compression_level=0设置进行编码,您仍然以特定格式(通常是标头)对图像进行编码。是什么引出了我们的第二个动机。

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