Загрузка .bmp в HBITMAP с уменьшением
От: Norfolc Тренажеры интуиции
Дата: 18.05.05 08:54
Оценка:
Есть файл .bmp.
Точнее область памяти с содержимым этого файла.
Требуется получить HBITMAP из этого файла. При этом размер полученного HBITMAP должен быть меньше.
Т.е. надо сделать иконку (Thumbnail) из этого файла.
Re: Загрузка .bmp в HBITMAP с уменьшением
От: avs.prg Украина  
Дата: 18.05.05 09:19
Оценка:
Здравствуйте, Norfolc, Вы писали:

N>Есть файл .bmp.

N>Точнее область памяти с содержимым этого файла.
N>Требуется получить HBITMAP из этого файла. При этом размер полученного HBITMAP должен быть меньше.
N>Т.е. надо сделать иконку (Thumbnail) из этого файла.

Немного непонятен вопрос...требуется вывести на экран уменьшенное изображение или сохранить в файле на диске?

Если выводим на экран, то используем StretchBlt(...) или StretchDIBits(...),
если нужно сохранить на диске, то выводим на контекст устройства с заранее выбранным пустым BITMAP c необходимыми габаритами, а затем формируем все необходимые структуры для файла формата BMP и сохраняем на диске.
Re[2]: Загрузка .bmp в HBITMAP с уменьшением
От: Norfolc Тренажеры интуиции
Дата: 18.05.05 09:37
Оценка:
Здравствуйте, avs.prg, Вы писали:

AP>Немного непонятен вопрос...требуется вывести на экран уменьшенное изображение или сохранить в файле на диске?

Необходимо вывести на экран.
У меня есть TreeView control, к которому присоединён ImageList. И я полученный HBITMAP добавляю в этот ImageList.
Делаю следующим образом:

Создаю ImageList
m_ImageList = ImageList_Create(THUMBNAIL_SIZE, THUMBNAIL_SIZE, ILC_COLOR24, 0, 1);


Получаю HBITMAP hThumb
void HUGEP * buf;
//...
//Получаем данные в формате .bmp в buf
//...
BITMAPFILEHEADER* fh;
fh = (BITMAPFILEHEADER*) buf;
BITMAPINFO *bmi, bmiTh;
bmi = (BITMAPINFO*)((char*) buf+sizeof(BITMAPFILEHEADER));

HDC hdc = CreateCompatibleDC(NULL);
void* buf2 = NULL;
HBITMAP hThumb, oldObj;
bmiTh = *bmi;
bmiTh.bmiHeader.biWidth = width; //width - нужная ширина
bmiTh.bmiHeader.biHeight = heigth;//heigth - нужная высота
hThumb = CreateDIBSection(hdc, &bmiTh, DIB_RGB_COLORS, &buf2, NULL, 0);
oldObj = (HBITMAP)SelectObject(hdc, hThumb);
SetStretchBltMode(hdc, COLORONCOLOR);
int x = StretchDIBits(hdc, 0, 0, width, heigth, 0, 0, bmi->bmiHeader.biWidth, bmi->bmiHeader.biHeight, (char*)buf + fh->bfOffBits, bmi, DIB_RGB_COLORS, SRCCOPY);
hThumb = (HBITMAP)SelectObject(hdc, oldObj);


и затем этот hThumb добавляю в m_ImageList.
Изображение выводится, но цвета у него не такие как в оригинале (особенно касается 8-битных в градациях серого).
Re[3]: Загрузка .bmp в HBITMAP с уменьшением
От: Norfolc Тренажеры интуиции
Дата: 18.05.05 11:13
Оценка: +1
N>Создаю ImageList
N>m_ImageList = ImageList_Create(THUMBNAIL_SIZE, THUMBNAIL_SIZE, ILC_COLOR24, 0, 1);


N>bmiTh.bmiHeader.biWidth = width; //width - нужная ширина
N>bmiTh.bmiHeader.biHeight = heigth;//heigth - нужная высота


Нашел в чём ошибка была:
ImageList у меня содержит 24 битные картинки.
Вот и все помещаемые туда HBITMAP-ы должны быть тоже 24 бит. Иначе они будут не того цвета.
Поэтому надо добавить следующую строчку:
bmiTh.bmiHeader.biBitCount = 24;
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.