原始RGB值为JPEG

时间:2014-03-31 21:02:17

标签: c++ image jpeg rgb

我有一个包含原始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);
}

但格式未被识别。

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

WOH THERE!

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

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

  1. 从RGB转换为YCbCr
  2. 示例图像
  3. 分为8x8块。
  4. 在每个区块上执行DCT。
  5. 运行长度/霍夫曼编码值
  6. 将这些值写入格式正确的JPEG块中。

答案 2 :(得分: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

相关联