用c ++或RAWW图像读取RAW图像有标题吗?

时间:2012-03-16 17:14:59

标签: c++ image

我从工作中的某些硬件获得了一些奇怪的图像。它们来自这个奇怪的硬件,它将多个图像拼接在一起并存储为原始图像。想想其中一个计算机安全显示器,一次显示四个图像。基本上就是这样。然后他们被存储为原始图像。 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( "Hi\n" );
    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;
}

3 个答案:

答案 0 :(得分:2)

看到原始图像格式的异构程度,我建议采用以下方法:

  • 尝试将原始图片与您可以找到的任何原始图片格式规范相匹配(有关指南,请参阅Wikipedia)。正如xpda指出的那样,试试FreeImage
  • 在图像中的任何位置搜索JPEG或TIFF标题,并在找到时尝试解释它。
  • 如果所有其他方法都失败了,请编写一些代码以逐字节比较各个图像以识别相似之处。对于连续拍摄的图像,如果它们具有元数据,则元数据应该非常相似。您可以对图像的内容有所了解,例如&#34;所有图像在前120个字节中都有20个公共字节&#34;意味着标题的可能性等等。或者你可以得出结论,图像没有任何标题,而且在你的情况下也是一些重要的知识(告诉你停止尝试)。

答案 1 :(得分:1)

您是否阅读了raw image format

此主题必须阅读:RAW Image file - what format is my data in?

答案 2 :(得分:1)

现代原始图像采用各种格式,包含标题和元数据,通常是压缩的,有时使用有损压缩进行压缩。许多原始格式未公开记录。 FreeImage可用于从许多数码相机中读取原始图像。

较旧的安全系统和其他相机可能只是存储原始数据 - 构成图像的一组数字而不是其他内容。这可能会也可能不会被压缩,它可能是也可能不是RGB值。

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