Есть файл .bmp.
Точнее область памяти с содержимым этого файла.
Требуется получить HBITMAP из этого файла. При этом размер полученного HBITMAP должен быть меньше.
Т.е. надо сделать иконку (Thumbnail) из этого файла.
Здравствуйте, 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-битных в градациях серого).
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;