我有一个包含原始 RGB 值的数组,我需要将这些值写入 JPEG 文件。有没有简单的方法可以做到这一点?
我尝试过:
std::ofstream ofs("./image.JPG", std::ios::out | std::ios::binary);
for (unsigned i = 0; i < width * height; ++i) {
ofs << (int)(std::min(1.0f, image[i].x) * 255) << (int)(std::min(1.0f, image[i].y) * 255) << (int)(std::min(1.0f, image[i].z) * 255);
}
但格式无法识别。
如果您尝试生成图像文件,您可以查看Netpbm。您可以根据现有的内容相当简单地编写中间格式(PBM 或 PAM)。然后有大量已编写的程序将从您的中间文件生成多种类型的图像。
哇那儿!
JPEG 比原始 RBG 值复杂得多。您将需要使用 LIBJPEG 等库将数据存储为 JPEG。
如果你自己写的话,你必须:
您可以使用 Boost GIL:它是免费的、可移植的(它是 Boost 库的一部分),可在多种操作系统(包括 Windows)上使用。
流行的 Linux 和 Unix 发行版(例如 Fedora、Debian 和 NetBSD)包含预构建的 Boost 软件包。
代码非常简单:
#include <boost/gil/extension/io/jpeg_io.hpp>
const unsigned width = 320;
const unsigned height = 200;
// Raw data.
unsigned char r[width * height]; // red
unsigned char g[width * height]; // green
unsigned char b[width * height]; // blue
int main()
{
boost::gil::rgb8c_planar_view_t view =
boost::gil::planar_rgb_view(width, height, r, g, b, width);
boost::gil::jpeg_write_view("out.jpg", view);
return 0;
}
jpeg_write_view 将当前实例化的视图保存到名称指定的 jpeg 文件中(如果创建文件失败,则抛出
std::ios_base::failure
)。
记得将您的程序与
-ljpeg
链接。
您可以使用像https://imagemagick.org/script/magick++.php这样的库来完成任务:
#include <Magick++.h>
Magick::Color color(red, green, blue);
Magick::Geometry size(width, height, /*xOff=*/0, /*yOff=*/0);
Magick::Image image(size, color);
image.write( "image.jpg" );
请参阅 https://www.imagemagick.org/Magick++/Image++.html 了解更多示例。