读取并将单色位图文件转换为CByTearray MFC



在我的MFC项目中,我需要读取并将单色位图文件转换为cbytearray。在使用"读取"模式的" CFILE"类读取位图文件的同时,它似乎比其原始的长度更长。

我的MFC代码: -

CFile ImgFile;
CFileException FileExcep;
CByteArray* pBinaryImage = NULL;
strFilePath.Format("%s", "D:\Test\Graphics0.bmp");
if(!ImgFile.Open((LPCTSTR)strFilePath,CFile::modeReadWrite,&FileExcep))
{
    return NULL;
}   
pBinaryImage = new CByteArray();
pBinaryImage->SetSize(ImgFile.GetLength());
// get the byte array's underlying buffer pointer
LPVOID lpvDest = pBinaryImage->GetData();
// perform a massive copy from the file to byte array
if(lpvDest)
{
    ImgFile.Read(lpvDest,pBinaryImage->GetSize());
}
    ImgFile.Close();

注意:将文件长度设置为bytearray obj。

我用C#检查了以下示例: -

        Bitmap bmpImage = (Bitmap)Bitmap.FromFile("D:\Test\Graphics0.bmp");
        ImageConverter ic = new ImageConverter();
        byte[] ImgByteArray = (byte[])ic.ConvertTo(bmpImage, typeof(byte[]));

在比较" pbinaryImage"one_answers" imgbytearray"的大小时,它不一样,我猜" imgbytearray"的大小是正确的,因为从这个数组值来看,我可以将我的原始位映射回去。

正如我在评论中指出的那样,通过使用CFile读取整个文件,您也正在读取将损坏数据的位图标头。

这是一个示例函数,显示了如何从文件中加载单色位图,将其包装在MFC的CBitmap对象中,查询尺寸等,然后将Pixel数据读取到一个数组中:

void LoadMonoBmp(LPCTSTR szFilename)
{
    // load bitmap from file
    HBITMAP hBmp = (HBITMAP)LoadImage(NULL, szFilename, IMAGE_BITMAP, 0, 0,
                                          LR_LOADFROMFILE | LR_MONOCHROME);
    // wrap in a CBitmap for convenience
    CBitmap *pBmp = CBitmap::FromHandle(hBmp);
    // get dimensions etc.
    BITMAP pBitMap;
    pBmp->GetBitmap(&pBitMap);
    // allocate a buffer for the pixel data
    unsigned int uBufferSize = pBitMap.bmWidthBytes * pBitMap.bmHeight;
    unsigned char *pPixels = new unsigned char[uBufferSize];
    // load the pixel data
    pBmp->GetBitmapBits(uBufferSize, pPixels);
    // ... do something with the data ....
    // release pixel data
    delete [] pPixels;
    pPixels = NULL;
    // free the bmp
    DeleteObject(hBmp);
}

BITMAP结构将为您提供有关位图的信息(在此处使用MSDN),对于单色位图,将将位包装到您阅读的字节中。这可能是与C#代码的另一个区别,在该代码中,每个位可能都被解开为整个字节。在MFC版本中,您需要正确解释此数据。

相关内容

  • 没有找到相关文章

最新更新