2014-03-27 112 views
2

目前我有一个ray-tracing program产生浮点(从0到1)或short值(从0到255)的RGB值。 (相关代码在ImageTools.cppImageTools.hpp。)如何将原始图像数据保存到PNG图像?

目前我可以通过编写PPM,这是可怕的庞大和臃肿产生图像。

如何从这些数组中的一个写入PNG图像?

我更喜欢不添加对大多数Linux系统上不常安装的任何内容的依赖,因为我迄今为止依赖于0。

+0

谷歌是你的朋友。搜索“png格式的源代码”。 –

+0

官方的PNG规范非常全面 - 我成功地构建了一个读取它的PNG读取器/写入器。另请参阅http://stackoverflow.com/questions/22672112/png-idat-specification了解一些指针。 – usr2564301

+1

如果您担心依赖关系,您可以使用CImg库,它只是一个标题,您可以将它添加到您的代码并随它一起分发。唯一的问题是编译时间显着增加。 –

回答

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

+0

想要简单的解决方案,谢谢 –

1

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

您可能需要安装devel软件包才能拿起标题,尽管这包含在我的股票CentOS 6.2机器上。

2

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

您可以使用原始格式(“P6”)轻松编写PPM文件,该文件占用的文件空间少得多,而且比ASCII“P3”格式的写入和读取更快。您甚至不需要将PPM作为文件存储;只是管它到pnmtopng:

your_application | pnmtopng > out.png 

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

+0

我会牢记这一点听起来像是一个很好的解决方案。 –

相关问题