在c++中读取RAW图像或Do RAW图像具有标题

Reading RAW images in c++ or Do RAW images have headers?

本文关键字:RAW 图像 标题 Do 读取 c++      更新时间:2023-10-16

我从工作中的一些硬件上得到了一些奇怪的图像。它们来自一个奇怪的硬件,它将多个图像拼接在一起并存储为原始图像。想象一下其中一个同时显示四个图像的计算机安全显示器。基本上就是这样。然后它们被存储为原始图像。Annnnd,这个旧垃圾根本没有任何文档。

我试图编写一个提取器,将图像分割成单独的原始文件。但我用来尝试读取我作为测试提取的图像的原始图像软件表明它已经损坏。我目前认为,即使只是原始数据,也应该有一个文件头。但无论我怎么努力,我似乎都无法在网上找到原始图像文件的定义。我看到有很多不同的原始图像文件类型,但我甚至找不到它们的定义。

有什么建议吗?

编辑:重读这篇文章后,我觉得我不是很清楚。我在读取我想要分割的原始文件时做了一个假设,假设我认为文件中没有标头,并开始用第一个字节的数据复制我提取的第一个图像的数据。我在我写的图像文件中也做了同样的假设,在复制图像时我没有写标题。我相信我关于没有头球的假设是不正确的,我要求澄清这一点。为了帮助阐明这一点,我将包含我编写的测试代码:

#include <stdio.h>
#include <string.h>
using namespace std;
//size of individual image
int width  = 400;
int height = 400;
//size of input image
int inputWidth  = 1600;
int inputHeight = 8000;
int offset = 16;
char strInputFile[]  = "captured.raw";
char strOutputFile[] = "extracted.raw";
int main()
{
    printf( "Hin" );
    FILE* pInput  = NULL;
    FILE* pOutput = NULL;
    char* buf = new char[width];
    memset( buf, 0, width );
    pInput  = fopen( strInputFile,"rb" );
    pOutput = fopen( strOutputFile,"wb" );
    if( pInput && pOutput )
    {
        for( int i = 0; i < height; i++ )
        {
            //read in a row of pixels
            fread( buf, 1, width, pInput );
            //write out the row of pixels
            fwrite( buf, 1, width, pOutput );
            //move the file pointer forward to the next row of pixels
            fseek( pInput, inputWidth - width, SEEK_CUR );
        }
    }
    fclose( pInput );
    fclose( pOutput );
    return 0;
}

考虑到原始图像格式的异构性,我建议采用以下方法:

  • 试着将你的原始图像与你能找到的任何原始图像格式规范相匹配(参考维基百科的指南)。正如xpda所指出的,请尝试FreeImage
  • 在图像中的任何位置搜索JPEG或TIFF标头,如果找到它,请尝试对其进行解释
  • 如果所有其他方法都失败了,那么编写一些代码来逐字节比较各个图像,以确定相似性。对于连续拍摄的图像,如果它们有元数据,则元数据应该非常相似。你可以对图像的内容有一些感觉,比如"所有图像的前120个字节中都有20个公共字节",这意味着可能有标题等等。或者你可能会得出图像没有任何标题的结论,这也是你的一些重要知识(告诉你停止尝试)

你读过关于原始图像格式的文章吗?

这个线程是必读的:RAW图像文件-我的数据是什么格式的?

现代原始图像有各种格式,带有标头和元数据,通常经过压缩,有时还会使用有损压缩进行压缩。许多原始格式没有公开文档。FreeImage可用于读取许多数码相机的原始图像。

旧的安全系统和其他摄像头可能只存储原始数据——一组组成图像的数字,而不存储其他数据。这可能是压缩的,也可能不是压缩的,它可能是RGB值,也可能是非RGB值。

如果没有文档,您可能不得不检查文件的数据,并使用历史悠久的试错编程技术。或者买新相机。:-)