如何将原始图像数据保存为png图像

How to save raw image data to png image?

本文关键字:图像 保存 png 数据 原始      更新时间:2023-10-16

目前我有一个光线追踪程序,可以在浮点(从0到1)或short值(从0到255)中产生RGB值。(相关代码在ImageTools.cpp和ImageTools.hpp.)

目前我可以通过编写PPM来生成图像,这非常大且臃肿。

我怎么能写一个PNG图像从这些数组之一?

我不喜欢在大多数Linux系统上不经常安装的任何东西上添加依赖项,因为到目前为止我没有依赖项。

可以使用Boost GIL

如果您有原始图像数据(或可以以某种方式生成它):

unsigned char r[width * height];  // red
unsigned char g[width * height];  // green
unsigned char b[width * height];  // blue

你可以这样写一个。png文件:

#include <boost/gil/extension/io/png_io.hpp>
boost::gil::rgb8c_planar_view_t view = boost::gil::planar_rgb_view(width, height, r, g, b, width);
boost::gil::png_write_view("out.png", view);

如果图像还包含alpha通道

unsigned char a[width * height];
然后

#include <boost/gil/extension/io/png_io.hpp>
boost::gil::rgba8c_planar_view_t view = boost::gil::planar_rgba_view(width, height, r, g, b, a, width);
boost::gil::png_write_view("out.png", view);

记得用-lpng

链接你的程序

还可以看看boost gil create image

我会让应用程序保持简单,只是继续编写PPM文件,然后使用现有的转换器,如ImageMagick(转换),GraphicsMagick (gm转换)或pnmtopng,它们都是开放源代码和免费使用的,或者许多其他免费或专有转换器中的任何一个。

您可以很容易地以原始格式("P6")编写PPM文件,它占用更少的文件空间,并且比ASCII"P3"格式更快地写入和读取。您甚至不需要将PPM存储为文件;只需将其管道到pnmtopng:

your_application | pnmtopng > out.png

pnmtopng是netpbm库的一部分,我假设您已经在使用它了。它依赖于libpng和zlib,但你可能已经有了。

我假设您不想自己实现标准,因此愿意通过在项目中引入一些依赖项来做出妥协。如果是这样,libpng通常安装在大多数linux系统上。http://www.libpng.org/pub/png/libpng.html

你可能需要安装devel包来获取头文件,尽管它包含在我的CentOS 6.2机器上。