在我的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”和“ImgByteArray”的大小时,它不相同,我猜“ImgByteArray”大小是正确的,因为从这个数组值开始,我可以恢复原来的位图。
答案 0 :(得分:1)
正如我在评论中所述,通过使用CFile
阅读整个文件,您还会阅读位图标题,这会损坏您的数据。
这是一个示例函数,展示如何从文件加载单色位图,将其包装在MFC的CBitmap
对象中,查询尺寸等,并将像素数据读入数组:
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 here)的信息,对于单色位图,这些位将打包到您读取的字节中。这可能是C#代码的另一个不同之处,它可能会将每个位解压缩为整个字节。在MFC版本中,您需要正确解释此数据。