Как вытащить BMP из ресурсов

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
ru_alex
Ветеран
Сообщения: 333
Зарегистрирован: 21 Сентябрь 2005, 11:05
Откуда: Нижний Новгород
Контактная информация:

Re: Как вытащить BMP из ресурсов

Сообщение ru_alex »

Может кому пригодится:
Не претендую на полную универсальность, но вроде как должно быть достаточно универсально.

Отображение независимого от устройства битмапа реализуется с помощью функции:

Код: Выделить всё

           StretchDIBits(ULONG hdc, LONG XDest, LONG YDest, LONG nDestWidth, LONG nDestHeight, |
                              LONG XSrc, LONG YSrc, LONG nSrcWidth, LONG nSrcHeight, |
                              ULONG lpBits, ULONG lpBitsInfo, ULONG iUsage, ULONG dwRop),LONG,RAW,PASCAL,NAME('StretchDIBits')
ну или SetDIBitsToDevice

большинство параметров понятно для чего, аналогично функции BitBlt. Осталось определить размер изображения и адреса для параметров lpBits и lpBitsInfo
lpBitsInfo - указатель на структуру BITMAPINFO, а lpBits - указатель на данные изображения, следующие за заголовком битмапа.
Нужно разбирать битмап. Исходные данные - адрес памяти. где расположен битмап и размер.

Сначала нужно считать заголовок файла (одинаковый для всех битмапов) в структуру BITMAPFILEHEADER.

Код: Выделить всё


BITMAPFILEHEADER    GROUP,TYPE
bfType                    USHORT ! должно содержать две буквы BM (04D42H)
bfSize                    ULONG ! полный размер файла
bfReserved1               USHORT ! херь
bfReserved2               USHORT ! херь
bfOffBits                 ULONG ! кол-во байт, которое занимает заголовок файла и заголовок битмапа, потом пригодится
                        END

MyBmpFileHeader group(BITMAPFILEHEADER )
                            end
addrResource     ULONG ! адрес ресурса в памяти, как получить, описывал в постах ранее

CODE
peek(addrResource, MyBmpFileHeader)

Затем считываем следующий блок данных, расположенный следом за заголовком файла в структуру BITMAPINFOHEADER (для Windows битмапов вроде только). Это будет заголовок битмапа.

Код: Выделить всё

BITMAPINFOHEADER GROUP,TYPE
biSize                  ULONG
biWidth                 LONG  ! ширина изображения
biHeight                LONG   ! высота изображения
biPlanes                USHORT
biBitCount              USHORT
biCompression           ULONG
biSizeImage             ULONG
biXPelsPerMeter         LONG
biYPelsPerMeter         LONG
biClrUsed               ULONG
biClrImportant          ULONG
                    END

MyBmpInfoHeader   group(BITMAPINFOHEADER)
                              end


CODE
peek(addrResource+size(BITMAPFILEHEADER ), MyBmpInfoHeader)

Теперь имеем все данные для отображения:

Код: Выделить всё

lpImage   ULONG
lpBitsInfo  ULONG
CODE
lpImage = addrResource + MyBmpFileHeader.bfOffBits   ! указатель на данные изображения
lpBitsInfo  = addrResource+size(BITMAPFILEHEADER )  ! указатель на начало структуры BITMAPINFO

res# = PTB:StretchDIBits(hMemDC, rWin.Left, rWin.Top, rWin.Right-rWin.Left, rWin.Bottom-rWin.Top, |
                              0, 0, MyBmpInfoHeader.biWidth, MyBmpInfoHeader.biHeight, |
                              lpImage, lpBitsInfo, DIB_RGB_COLORS, SRCCOPY)
 

Ответить