繁体   English   中英

原始RGB值到JPEG

[英]Raw RGB values to JPEG

我有一个带有原始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。

如果您自己编写,则必须:

  1. 从RGB转换为YCbCr
  2. 采样图像
  3. 分成8x8块。
  4. 在每个块上执行DCT。
  5. 游程/霍夫曼编码值
  6. 将这些值写入格式正确的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则抛出std::ios_base::failure )。

请记住将您的程序与-ljpeg链接。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM