【问题标题】:How to save raw image data to png image? [closed]如何将原始图像数据保存为 png 图像? [关闭]
【发布时间】:2014-03-27 19:20:05
【问题描述】:

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

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

如何从这些数组之一写入 PNG 图像?

我不希望对大多数 Linux 系统上不常用的任何东西添加依赖项,因为到目前为止我有 0 个依赖项。

【问题讨论】:

  • Google 是您的朋友。搜索“png格式源代码”。
  • 官方的PNG规范非常详尽——我成功地构建了一个PNG阅读器/编写器来阅读它。另请参阅stackoverflow.com/questions/22672112/png-idat-specification 以获得一些指示。
  • 如果您担心依赖关系,您可以使用 CImg 库,它只是一个标头,您可以将其添加到您的代码中并与它一起分发。唯一的问题是编译时间显着增加。
  • @JaviV +1 CImg 非常好。不幸的是,我认为使用它来输出 PNG 仍然需要外部依赖项(参见 cimg.sourceforge.net/reference/group__cimg__files__io.html)。
  • 是的,我忘了 :( 那么我也建议使用 libpng

标签: c++ c++11 png


【解决方案1】:

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

【讨论】:

  • 喜欢简单的解决方案。谢谢。
  • 看起来 png_io.hppdeleted。我改为包含png.hpp,并将png_write_view 更改为boost::gil::write_view("out.png", view, boost::gil::image_write_info&lt;boost::gil::png_tag&gt;());
【解决方案2】:

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

您可以轻松地以原始格式 (“P6”) 编写 PPM 文件,该格式占用的文件空间少得多,并且比 ASCII“P3”格式的读写速度更快。您甚至不需要将 PPM 存储为文件;只需将其通过管道传输到 pnmtopng:

your_application | pnmtopng > out.png

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

【讨论】:

  • 我会记住这一点。听起来是个不错的解决方案。
【解决方案3】:

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

您可能需要安装 devel 包来获取标题,尽管这包含在我的 CentOS 6.2 机器上。

【讨论】:

    猜你喜欢
    • 2010-09-25
    • 1970-01-01
    • 1970-01-01
    • 2012-10-16
    • 1970-01-01
    • 1970-01-01
    • 2019-11-08
    • 2023-04-01
    • 2014-10-05
    相关资源
    最近更新 更多