c - 编写未压缩的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);
}
解决方案
您似乎有两个不同的问题或动机。
首先,希望以某种未压缩格式写入图像以(可能)提高速度。PNG 和 JPEG 是压缩格式,尽管您可以指示编码器(至少在某些 PNG 实现中)使用“无压缩”设置。
但是:a)在少数情况下,“优化”会产生重大影响,普通压缩器非常快。
b) 即使在使用某些compression_level=0
设置进行编码时,您仍在以特定格式(通常是标题,开始时)对图像进行编码。是什么让我们想到了第二个动机。
其次,您似乎不想完全(仅)避免压缩,而是避免编码。也就是说,您想以未编码(“原始”)格式写入像素。当然,在这种情况下,您不能编写 PNG 或 JPEG 图像。您可以使用自己的或某些标准 RAW 格式,或准原始BMP格式。但是您仍然需要注意像素在内存中的组织方式(例如,每个通道一个字节?RGB?BGR?RGBA ?)也许还有其他一些问题(例如,BMP 要求每行的字节数是4)。
推荐阅读
- ios - iOS 使用 Agora 语音通话加入和离开频道时状态栏显示为红色
- php - 在php中进行求和时如何处理空值
- python - Runtime.ImportModuleError:无法导入模块“lambda_function”:没有名为“httplib2”的模块
- laravel - 如何在laravel中显示具有yajra数据表多对多关系的数据?
- hadoop - 为什么 cloudera 5.12 vm 中的默认复制因子为 1,而在以前的版本中为 3?
- swift - 向现有项目添加共享扩展。所以已经存在的项目 pod 开始出现错误
- python - 如何将字体标签设置为 Helvetica 并使用 matplotlib 重新设计轴标签文本
- openshift - VMware 上的 Openshift OKD 4.5
- javascript - 将数组数组附加到 FormData 并通过 AJAX 发送
- angular - 我们如何覆盖 angular2-query-builder 中的 getInputType 函数