2014-01-17 2 views
0

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

BITMAPFILEHEADER bh; 
    ZeroMemory(&bh, sizeof(BITMAPFILEHEADER)); 
    bh.bfType = 0x4d42; //bitmap 
    bh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); 
    bh.bfSize = bh.bfOffBits + ((IM_WIDTH*IM_HEIGHT*2)*3); 

    CFile file; 
    if(file.Open("Image1.bmp", CFile::modeCreate | CFile::modeWrite)) 
    { 
     file.Write(&bh, sizeof(BITMAPFILEHEADER)); 
     file.Write(&(bmi.bmiHeader), sizeof(BITMAPINFOHEADER)); 
     file.Write(im_final, 3 * IM_WIDTH * IM_HEIGHT*2); 
     file.Close(); 
    } 

Я использую тот же BITMAPINFOHEADER, который использовался для отображения изображения. Но сохраненное изображение неверно. Пожалуйста, скажите мне, что я делаю неправильно.

+1

См http://msdn.microsoft.com/en-us/library/windows/desktop/dd183391.aspx и http://webproverka.com///en.wikipedia.org/wiki/BMP_file_format. Должна быть определенная дополнительная информация после «BITMAPINFOHEADER» перед фактическими данными пикселя; точная форма этой дополнительной информации зависит от формата растрового изображения, указанного в 'BITMAPINFOHEADER'. Кроме того, каждая строка сканирования должна дополняться 4-байтной границей. Если 'IM_WIDTH' не кратно 4, то ваши вычисления размера данных неверны. Кстати, почему вы умножаетесь на 2? '* 3', вероятно, потому, что у вас есть растровое изображение 24bpp, но почему дополнительный' * 2'? –

+0

Экстра 2 - это потому, что я масштабирую свое изображение, поэтому мне нужно удвоить высоту. Спасибо за ответ. Я просмотрю информацию заголовка. Ширина моего изображения кратная 4, поэтому это не проблема. – Khushboo

+0

Эй, спасибо тонну :) Информация заголовка сделала это для меня. Я включил информацию о RGBQUAD и теперь работает. – Khushboo

ответ

0

Это код, я использую в настоящее время, который работает отлично:

BITMAPFILEHEADER bmfh; 
    bmfh.bfType = 0x4d42; /* "BM" */ 
    bmfh.bfSize = (sizeof(BITMAPFILEHEADER) + bmih.biSize + bmih.biClrUsed * sizeof(RGBQUAD) + bmih.biSizeImage); 
    bmfh.bfReserved1 = 0; 
    bmfh.bfReserved2 = 0; 
    bmfh.bfOffBits = sizeof(BITMAPFILEHEADER) + bmih.biSize + bmih.biClrUsed * sizeof(RGBQUAD); 

CString file = m_filepath; 
char* savefile = file.GetBuffer(); 

hFile = CreateFile(savefile, GENERIC_WRITE, 0, (LPSECURITY_ATTRIBUTES) NULL, CREATE_ALWAYS, 
    FILE_ATTRIBUTE_NORMAL, (HANDLE) NULL);  





if (hFile != INVALID_HANDLE_VALUE) 
    { 

     WriteFile(hFile, (char *) &bmfh, sizeof(BITMAPFILEHEADER), (LPDWORD) &err, NULL); 
     WriteFile(hFile, (char *) &bmih, sizeof(BITMAPINFOHEADER), (LPDWORD) &err, NULL); 
     WriteFile(hFile, (char *) &bmi.bmiColors, sizeof(bmi.bmiColors), (LPDWORD) &err, NULL); 
     WriteFile(hFile, im_rgb, bmih.biSizeImage, (LPDWORD) &err, NULL); 

    CloseHandle(hFile); 
    } 
Смежные вопросы