原始 RGB 值转为 JPEG

问题描述 投票:0回答:4

我有一个包含原始 RGB 值的数组,我需要将这些值写入 JPEG 文件。有没有简单的方法可以做到这一点?

enter image description here

我尝试过:

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);
}

但格式无法识别。

c++ image jpeg rgb
4个回答
1
投票

如果您尝试生成图像文件,您可以查看Netpbm。您可以根据现有的内容相当简单地编写中间格式(PBM 或 PAM)。然后有大量已编写的程序将从您的中间文件生成多种类型的图像。


0
投票

哇那儿!

JPEG 比原始 RBG 值复杂得多。您将需要使用 LIBJPEG 等库将数据存储为 JPEG。

如果你自己写的话,你必须:

  1. 从 RGB 转换为 YCbCr
  2. 图像样本
  3. 分成 8x8 块。
  4. 对每个块执行 DCT。
  5. 游程/霍夫曼对值进行编码
  6. 将这些值写入格式正确的 JPEG 块中。

0
投票

您可以使用 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
链接。


0
投票

您可以使用像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 了解更多示例。

© www.soinside.com 2019 - 2024. All rights reserved.