目前我有ray-tracing program以浮点(从0到1)或short
值(从0到255)生成RGB值。 (相关代码位于ImageTools.cpp和ImageTools.hpp。)
目前我可以通过写PPM来制作图像,这是非常庞大和臃肿的。
如何从其中一个阵列中写入PNG图像?
我不想在大多数Linux系统上没有通常安装的任何东西上添加依赖项,因为到目前为止我有0个依赖项。
答案 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链接
答案 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计算机上。