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

时间:2014-03-27 19:20:06

标签: c++ c++11 png

目前我有ray-tracing program以浮点(从0到1)或short值(从0到255)生成RGB值。 (相关代码位于ImageTools.cppImageTools.hpp。)

目前我可以通过写PPM来制作图像,这是非常庞大和臃肿的。

如何从其中一个阵列中写入PNG图像?

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

3 个答案:

答案 0 :(得分:3)

您可以使用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

答案 1 :(得分:2)

我会保持应用程序简单,只需继续编写PPM文件,然后使用现有的转换器,如ImageMagick(转换),GraphicsMagick(gm convert)或pnmtopng,它们都是开源的,可以免费使用,或者任何其他免费或专有转换器。

您可以轻松地以原始格式(&#34; P6&#34;)编写PPM文件,这样可以占用更少的文件空间,并且比ASCII&#34; P3&#34;更快地进行写入和读取。格式。您甚至不需要将PPM存储为文件;把它管道到pnmtopng:

your_application | pnmtopng > out.png

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

答案 2 :(得分:1)

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

您可能需要安装devel软件包以获取标题,尽管这已包含在我的CentOS 6.2计算机上。