Сохранение изображения в BMP-файл
От: pretty_tut  
Дата: 25.04.04 17:42
Оценка:
Подскажите, пожалуйста, по какой причине 32-х битное изображение сохраняется в BMP-файл черным цветом.
Заранее огромное спасибо..
Re: Сохранение изображения в BMP-файл
От: adontz Грузия http://adontz.wordpress.com/
Дата: 25.04.04 23:43
Оценка:
Здравствуйте, pretty_tut, Вы писали:

Может быть надо делать не CreateCompatibleDC(NULL), а копироать цветной DC? Например DC экрана CreateDC(_T("DISPLAY"), NULL, NULL, NULL);
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[2]: Сохранение изображения в BMP-файл
От: Michael Chelnokov Украина  
Дата: 26.04.04 16:58
Оценка:
Здравствуйте, adontz, Вы писали:

A>Может быть надо делать не CreateCompatibleDC(NULL), а копироать цветной DC? Например DC экрана CreateDC(_T("DISPLAY"), NULL, NULL, NULL);


Скорее проблема не в CreateCompatibleDC, а в CreateCompatibleBitmap(CreateCompatibleDC). В совместимый DC изначально выбирается монохромный BITMAP 1х1 пиксел, поэтому совместимый растр получится тоже монохромным. А DC экрана можно получить и через GetDC(NULL).

Хотя кто сказал что экран цветной?

В-общем, просьба к автору вопроса уточнить подробности того, как он сохраняет BMP, тогда и будет получен правильный ответ.
Re[3]: Сохранение изображения в BMP-файл
От: pretty_tut  
Дата: 27.04.04 16:58
Оценка:
Здравствуйте, Michael Chelnokov и adontz !

Большое спасибо за сделанные рекомендации.
Вы писали:
просьба к автору вопроса уточнить подробности того, как он сохраняет BMP, тогда и будет получен правильный ответ.

Мой код таков:

hdcDesk = GetDC(0); //получение контекста рабочего экрана

MemDC = CreateCompatibleDC (hdc);
bmp = CreateCompatibleBitmap (hdc, str.w, str.h);
SelectObject (MemDC, bmp);
BitBlt (MemDC, 0, 0, str.w, str.h, hdcDesk, 0, 0, SRCCOPY);

GetObject(bmp, sizeof(BITMAP), &bm);

int nColors;
nColors = bm.bmBitsPixel;

memset(&bmfh,0, sizeof(bmfh));
bmfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFO);
bmfh.bfType = 0x4d42;
bmfh.bfSize = bm.bmHeight * bm.bmWidth +
sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);

int res;
res = WriteFile(hFile, &bmfh, sizeof(bmfh), &fWrite, NULL);


memset(&bmi,0, sizeof(bmi));
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmi.bmiHeader.biWidth = bm.bmWidth;
bmi.bmiHeader.biHeight = bm.bmHeight;
bmi.bmiHeader.biPlanes = bm.bmPlanes; //=1
bmi.bmiHeader.biBitCount = bm.bmBitsPixel;
bmi.bmiHeader.biCompression = BI_RGB;
bmi.bmiHeader.biSizeImage = bm.bmHeight * bm.bmWidth;

// необх-мо для доступа к растру
bmpDesk = CreateDIBSection(hdcDesk, &bmi, DIB_RGB_COLORS, (void **)&lpBits, NULL, NULL);

//копируем катринку в эту область
SetDIBits(MemDC, bmpDesk, 0, bmi.bmiHeader.biHeight,
lpBits, &bmi, DIB_RGB_COLORS);


BitBlt (hdc, 0, 0, str.w, str.h, MemDC, 0, 0, SRCCOPY);

res = WriteFile(hFile, &bmi, sizeof(bmi), &fWrite, NULL);


res = WriteFile(hFile, lpBits, bm.bmHeight * bm.bmWidth, &fWrite, NULL);



С уважением pretty_tut!
Re[4]: Сохранение изображения в BMP-файл
От: Андрей Михеев Россия  
Дата: 28.04.04 12:48
Оценка:
Здравствуйте, pretty_tut, Вы писали:

CreateCompatibleBitmap и CreateCompatibleDC надо вызывать ТОЛЬКО с не compatible DC, т.е. экранной.

HDC hdc = CreateDC("DISPLAY", 0, 0, 0);
HDC hdcCompat = CreateCompatibleDC(hdc);
HBITMAP bmpCompat = CreateCompatibleBitmap(hdc, 100, 100);
... << RSDN@Home 1.1.3 stable >>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.