如何将原始图像数据保存为png图像
How to save raw image data to png image?
目前我有一个光线追踪程序,可以在浮点(从0到1)或short
值(从0到255)中产生RGB值。(相关代码在ImageTools.cpp和ImageTools.hpp.)
目前我可以通过编写PPM来生成图像,这非常大且臃肿。
我怎么能写一个PNG图像从这些数组之一?
我不喜欢在大多数Linux系统上不经常安装的任何东西上添加依赖项,因为到目前为止我没有依赖项。
可以使用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
我会让应用程序保持简单,只是继续编写PPM文件,然后使用现有的转换器,如ImageMagick(转换),GraphicsMagick (gm转换)或pnmtopng,它们都是开放源代码和免费使用的,或者许多其他免费或专有转换器中的任何一个。
您可以很容易地以原始格式("P6")编写PPM文件,它占用更少的文件空间,并且比ASCII"P3"格式更快地写入和读取。您甚至不需要将PPM存储为文件;只需将其管道到pnmtopng:
your_application | pnmtopng > out.png
pnmtopng是netpbm库的一部分,我假设您已经在使用它了。它依赖于libpng和zlib,但你可能已经有了。
我假设您不想自己实现标准,因此愿意通过在项目中引入一些依赖项来做出妥协。如果是这样,libpng通常安装在大多数linux系统上。http://www.libpng.org/pub/png/libpng.html
你可能需要安装devel包来获取头文件,尽管它包含在我的CentOS 6.2机器上。
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- 使用FFMPEG将RGB图像序列保存到.mp4时出现问题
- 将RGB图像保存为PPM格式
- Gstreamer:每 5 秒使用多文件墨水保存图像/jpeg
- 是否可以通过每次在内存中仅保存一个平铺来处理完整的平铺 tiff 图像?
- 将图像魔术 blob 保存到节点缓冲区
- 是否可以将图像列表保存到文件中?
- 在opencv c++目录中从/加载/保存多个图像
- 将 JPG 编码数组从 ROS sensor_msgs/压缩图像保存到 roscpp 中的文件
- 我想将 OpenCV 中处理后的图像保存为“input_name+enhanced.input_image_format
- 无法将图像保存在具有白色背景的JPG中 OpenCV
- c++:尝试将创建的图像保存到.jpg文件,但图像无法打开
- 将许多图像保存到矢量中,但它们不显示
- QT:将整个QSCrollarea内容作为图像保存
- 打开CV图像保存以较小的尺寸,无需压缩
- 将图像保存到内存
- Boost::GIL如何将图像保存为JPEG或PNG为char*
- c++ 32位tiff图像保存和加载
- 如何将图像保存为字符串的c++源代码
- 使用opencv将图像保存为ycbcr格式