【问题标题】:Raw RGB values to JPEG原始 RGB 值转为 JPEG
【发布时间】:2014-05-11 09:55:13
【问题描述】:

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

但格式无法识别。

【问题讨论】:

  • 您看过 JPEG 规范吗?或者,如果您不想手动编码数据(我建议您不要这样做),libjpeg 是一个流行的选择。
  • Err... 除了整个“JPEG 格式”之外,您是否要制作一个像素高、X 像素宽的单个 JPEG?如果没有,JPEG 应该如何知道如何将像素线包装到图像中?
  • @meagar 不,这只是我要存储的数据的格式。
  • @TylerSebastian 这个问题没有意义。为什么你认为你需要一个“格式”?您是否正在尝试制作人们可以使用 JPEG 查看器查看的图像?您只是想存储一堆任意字节以供以后读取,还是想生成图像,在您的程序之外查看?
  • 那么……你需要回答我的问题。您是否尝试生成 1 像素高的图像?或者你的图像有实际尺寸吗?如果它有尺寸,如果你只是在写一个表示 RGB 值的字节流,你如何期望 JPEG 知道如何计算出来?如果您写入 6 个字节,则可能是 1x6、2x3、3x2 或 6x1 图像。 JPEG 不能只知道,您必须提供该数据。

标签: c++ image jpeg rgb


【解决方案1】:

您可以使用Boost GIL:它是免费的、可移植的(它是 Boost 库的一部分),可用于广泛的操作系统(包括 Windows)。

Fedora、Debian 和 NetBSD 等流行的 Linux 和 Unix 发行版包含预构建的 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链接你的程序。

【讨论】:

    【解决方案2】:

    哇!

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2016-10-23
        • 2011-07-28
        • 1970-01-01
        • 2020-10-12
        • 2022-10-02
        • 1970-01-01
        • 2011-10-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多