c++ - 十六进制数据 (RGB888) 中的图像文件到 BMP、JPG、PNG 或其他格式

标签 c++ image hex rgb

我遇到了以下问题,我得到了图像文件(应该是 RGB888),但我不确定它是否真的是这种数据。 (我只知道数据的假定格式(例如 400 * 600),这就是为什么我制作了一张图片的样本数据,我确切地知道十六进制数据的格式。)

我创建的数据看起来像这样:

0xf3, 0x8d, 0x4c, 0xff, 0xf2, 0x8f, 0x4b, 0xff, 0xef, ...

在这种情况下,我确定这是 RGB888,因为我转换了它。 所以我做的第一步是加载文件并将数据流式传输到 char 数组。

std::ifstream infile;
char *array;
uint8_t *pixelValues;

infile.exceptions ( std::ifstream::failbit );
try {
  infile.open(filename, std::ios_base::binary); 
    infile >> std::hex >> std::setw(2) >> std::setfill('0');  
    int length;

    if (!infile.bad()) {
        length = infile.rdbuf()->pubseekoff(0, std::ios_base::end);
        array = new char[length];
        infile.rdbuf()->pubseekoff(0, std::ios_base::beg);
        infile.read(array, length);
        infile.close();
    }

    uint8_t value;
    pixelValues = new uint8_t[length/5];

    std::size_t counter = 0;
    std::size_t valueCounter = 0;

    while (true) {              
        value = strtol(&array[counter], NULL, 0);
        pixelValues[valueCounter++] = value;

        while ((array[counter] != ',')) counter++;  
        counter++;
        if (counter >= length) break;
    }
}

在这一步之后,uint8_t pixelValues 中的数据应该是文件中数据的位数组。

我现在的问题是,如何继续......我做的事情是正确的还是有“更聪明”的方法从这个十六进制数据中获取图像?

我的同事告诉我,我应该使用 openCV 继续下一步,但我根本无法运行它。

如果你们中有人有好的想法,请告诉我;-)

最佳答案

当有人给你一张原始图像并说它是 400x600 像素的 RGB888 时,首先要检查的是查看文件大小,看看它是否:

400 * 600 * 3

字节,您可以在它们离开之前很容易地检查这些字节,让您对格式和内容产生一些错误的印象。那么,您的文件正好是 720,000 字节吗?


如果您想要以最简单的方式获取 PNG 或 JPEG,您只需在终端/命令提示符的命令行中使用 ImageMagick。所以,如果它是 400 像素宽和 600 像素高和 RGB888,您将执行以下操作以获得 PNG 文件:

magick -depth 8 -size 400x600 RGB:YourFile.dat result.png

如果您想要 JPEG,请使用:

magick -depth 8 -size 400x600 RGB:YourFile.dat result.jpg

如果您不想安装 ImageMagick,您可以输入 NetPBM PPM终端文件前面的 header ,如下所示:

printf "P6\n400 600\n255\n"  >  result.ppm
cat YourImage.dat            >> result.ppm

然后您将拥有一个 PhotoshopGIMPfeh 和许多其他程序可以读取并另存为 PNG 或 JPG 的文件。当然,您可以用 3 行 C++ 完成完全相同的事情。


如果没有吸引您的,您可以使用CImg - 一个出色、小巧、易于使用的 C++ 图像处理库。参见 here举个例子。

关于c++ - 十六进制数据 (RGB888) 中的图像文件到 BMP、JPG、PNG 或其他格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53724976/

相关文章:

c++ - 在 C++ 中打印链表

c++ - 需要大尺寸静态数组

c++ - 这段 C++ 代码是如何工作的?

php - 如何解析 xml 站点地图中的图像标签?

.net - 在 VB.NET 中将十六进制值存储在变量中(Dim xx as "Hex")

c++ - 不调用非模板成员函数的显式特化

html - 如何裁剪不拉伸(stretch) slider 中的图像?我试过 'background:cover'

c# - Silverlight 根据存储在 IsolatedStorage 中的变量刷新图像

ios - 给定一个颜色的十六进制,我怎样才能使该颜色更亮或更暗?

c++ - 将 unsigned char 数组打印为十六进制