2014-01-20 3 views
1

В моем проекте MFC мне нужно прочитать и преобразовать файл с монохромным растровым изображением в CByteArray. При чтении растрового файла с использованием класса «CFile» с режимом «Чтение» кажется, что он дает больше длины, чем его оригинал.Чтение и конвертирование монохромного файла растрового изображения в CByteArray 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

Ваш пример C# анализирует заголовок растрового изображения и дает только пиксели. Ваш пример MFC читает весь битмап, включая заголовки, и вы не знаете, где находятся данные пикселя. Перед чтением необходимо знать формат растрового файла. –

+0

@RogerRowland: Спасибо за ваш комментарий. Я проверил оба размера bytearray с моими другими растровыми изображениями. В большинстве случаев оба они одинаковы. Для нескольких растровых изображений это не так. Тогда только я сомневался в размере, который нужно прочитать. Было бы полезно для меня, если вы дадите решение. – user3214228

ответ

1

Как я отметил в комментариях, прочитав весь файл с помощью CFile, вы также читаете заголовки растровых изображений, которые будут искажать ваши данные.

Ниже приведен пример функции, показывающий, как загружать монохромное растровое изображение из файла, завернуть его в 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 вам нужно будет правильно интерпретировать эти данные.

Смежные вопросы