четверг, 6 августа 2009 г.

Загрузка bmp, gif, jpg изображений

Программисту, привыкшему решать проблемы "в лоб", трудно поверить в то, что для загрузки в свою программу изображений из файлов популярных графических форматов (bmp, gif, jpg), совсем необязательно знать их структуру!
Для начала, нужно имя требуемого файла преобразовать в Юникод с помощью функции MultiByteToWideChar(...). Передав Юникодовское имя в функцию OleLoadPicturePath(...), можно получить указатель на интерфейс IPicture, который позволит единообразно обращаться к разным свойствам и методам объекта-изображения независимо от его формата.
Нам понадобятся методы, возвращающие ширину: get_Width(...) и высоту: get_Height(...) картинки. Полученные значения будут в сотых долях миллиметра, поэтому для пересчета их в пикселы нужно функцией GetDeviceCaps(...) узнать количество пикселов на дюйм экрана и, чтобы вычисления были точными, применить функцию MulDiv(...) для получения высоты и ширины в пикселах.
<Пикселы> = MulDiv(<сотые доли миллиметра>, <пикселов на дюйм>, (2,54*100*10))
Полученные ширину и высоту заносим в структуру BITMAPINFO и, передав ее функции CreateDIBSection(...), строим HBITMAP нужного размера.
Теперь можно вызвать метод Render интерфейса IPicture, чтобы отрисовать в созданный HBITMAP хранящуюся в файле картинку. Мы не знаем (и знать не хотим :-) ни степени сжатия (для jpg) ни используемой палитры (для gif) — метод Render выполняет за нас всю тяжелую работу по интерпретации соответствующего формата!
Получив в HBITMAP попиксельное представление изображения, можно передать его одной из OpenGL функций генерации текстуры, например, gluBuild2DMipmaps(...) и увидеть на экране прочитанное из файла изображение.

Вывод: прежде чем писать свою функцию, стоит поискать в MSDN похожую.

Комментариев нет:

Отправить комментарий

Можете оставить комментарий: