0

我正在尝试从高性能相机(Allied Vision Technologies Prosilica GT2750)捕获的图像创建 24 位图图像。这是我到目前为止所拥有的:(注意 VmbUInt32 被定义为“typedef unsigned __int32 VmbUint32_t;”并且 VmbUchar_t 只是一个无符号字符)

        VmbUint32_t imageSize = 0;
        pFrame->GetImageSize(imageSize); //imageSize = 6054400

        VmbUint32_t imageWidth = 0;
        pFrame->GetWidth(imageWidth);    //imageWidth = 2752
        VmbUint32_t imageHeight = 0;
        pFrame->GetHeight(imageHeight);  //imageHeight = 2200

        //////////////////////////////////////////////////////////////////////////
        //////////  Set Bitmap Settings   ////////////////////////////////////////
        //////////////////////////////////////////////////////////////////////////

        //file header
        BITMAPFILEHEADER* bf = new BITMAPFILEHEADER;
        bf->bfType              = 0x4d42;
        bf->bfSize              = imageSize + 40 + 14; //image size + infoheader size + fileheader size 
        bf->bfOffBits           = 54;

        //info header
        BITMAPINFOHEADER* bi = new BITMAPINFOHEADER;
        bi->biSize              = 40;
        bi->biWidth             = imageWidth;
        bi->biHeight            = imageHeight;
        bi->biPlanes            = 1;
        bi->biBitCount          = 24;
        bi->biCompression       = 0;
        bi->biSizeImage         = imageSize;
        bi->biXPelsPerMeter     = 2835;
        bi->biYPelsPerMeter     = 2835;
        bi->biClrUsed           = 0;
        bi->biClrImportant      = 0;


        //image data
        VmbUchar_t* imageData = new VmbUchar_t[imageSize];
        pFrame->GetImage(imageData);


        //////////////////////////////////////////////////////////////////////////
        //////////  Output File to .bmp   ////////////////////////////////////////
        //////////////////////////////////////////////////////////////////////////


        std::ofstream outFile;

        outFile.open("test.bmp", std::ios::binary|std::ios::out);

        outFile.write(reinterpret_cast<char *>(bf), sizeof(BITMAPFILEHEADER));
        outFile.write(reinterpret_cast<char *>(bi), sizeof(BITMAPINFOHEADER));
        outFile.write(reinterpret_cast<char *>(imageData), imageSize);

        outFile.close();

基本上正在发生的事情是数据正在正确写入 test.bmp,但 test.bmp 在标准图像查看器中仍然无法打开。当我在十六进制编辑器中查看 test.bmp 时,似乎一切正常。我知道 imageData 工作正常,因为当我将灯光调到最大时,imageData 只是一堆 FF(又名白色),当我关灯时,imageData 的每个像素都是 00、01 或 02。​​(又名黑色或接近黑色)。因此文件的 imageData 部分正在正确写入。我可以使用他们提供的软件来查看相机的图像,因此我知道相机工作正常(这也是我用来确保光线足够亮以成为白屏并且足够暗以用于黑屏的方法)。但是,文件头或信息头(或两者)一定有问题,

这是文件头和信息头的十六进制数据:

42 4D 36 62 5C 00 CD CD CD CD 36 00 00 00 28 00 00 00 C0 
0D 0A 00 00 98 08 00 00 01 00 18 00 00 00 00 00 00 62 5C 
00 13 0B 00 00 13 0B 00 00 00 00 00 00 00 00 00 00

每次运行时的 imageSize、imageWidth 和 imageHeight 都是相同的(分别为 6054400、2752、2200),获取它们的函数来自相机的 API。这些工作正常并且简单地返回整数(至少从我在汽车中看到的)。

其他信息:我正在使用 Visual Studio 2010。

TL;DR:我的文件头和/或信息头有什么问题?

4

1 回答 1

0

您可能缺少 File 标头中的两个保留字段。

文件头:4字节BMP文件的大小,以字节为单位,2字节保留;实际值取决于创建图像的应用程序 保留 2 个字节;实际值取决于创建图像的应用程序 4 字节偏移量,即起始地址,位图图像数据(像素阵列)可以找到的字节。

于 2013-06-26T22:28:17.477 回答