目前我有一个ray-tracing program产生浮点(从0到1)或short
值(从0到255)的RGB值。 (相关代码在ImageTools.cpp和ImageTools.hpp。)如何将原始图像数据保存到PNG图像?
目前我可以通过编写PPM,这是可怕的庞大和臃肿产生图像。
如何从这些数组中的一个写入PNG图像?
我更喜欢不添加对大多数Linux系统上不常安装的任何内容的依赖,因为我迄今为止依赖于0。
目前我有一个ray-tracing program产生浮点(从0到1)或short
值(从0到255)的RGB值。 (相关代码在ImageTools.cpp和ImageTools.hpp。)如何将原始图像数据保存到PNG图像?
目前我可以通过编写PPM,这是可怕的庞大和臃肿产生图像。
如何从这些数组中的一个写入PNG图像?
我更喜欢不添加对大多数Linux系统上不常安装的任何内容的依赖,因为我迄今为止依赖于0。
你可以使用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
想要简单的解决方案,谢谢 –
我假设你不想自己实现这个标准,因此愿意通过在你的项目中引入一些依赖来妥协。如果是这样,libpng通常安装在大多数Linux系统上。 http://www.libpng.org/pub/png/libpng.html
您可能需要安装devel软件包才能拿起标题,尽管这包含在我的股票CentOS 6.2机器上。
我会保持应用程序简单,只是继续写一个PPM文件,然后使用现有的转换器,如ImageMagick(convert),GraphicsMagick(gm convert)或pnmtopng,它们都是开源且免费使用的,或者任何其他免费或专有转换器。
您可以使用原始格式(“P6”)轻松编写PPM文件,该文件占用的文件空间少得多,而且比ASCII“P3”格式的写入和读取更快。您甚至不需要将PPM作为文件存储;只是管它到pnmtopng:
your_application | pnmtopng > out.png
pnmtopng是我假设你已经使用的netpbm库的一部分。它取决于libpng和zlib,但你可能已经有了这些。
我会牢记这一点听起来像是一个很好的解决方案。 –
谷歌是你的朋友。搜索“png格式的源代码”。 –
官方的PNG规范非常全面 - 我成功地构建了一个读取它的PNG读取器/写入器。另请参阅http://stackoverflow.com/questions/22672112/png-idat-specification了解一些指针。 – usr2564301
如果您担心依赖关系,您可以使用CImg库,它只是一个标题,您可以将它添加到您的代码并随它一起分发。唯一的问题是编译时间显着增加。 –