Если файл хранится в формате BMP, как мне преобразовать его в
DIB и как затем отобразить?
Это не тривиально, но помочь нам смогут функции GetDIBSizes и GetDIB из
модуля GRAPHICS.PAS. Приведу две процедуры: одну для создания DIB из TBitmap и
вторую для его освобождения:
{ Преобразование TBitmap в DIB }procedure BitmapToDIB(Bitmap: TBitmap;
var BitmapInfo: PBitmapInfo;
var InfoSize: integer;
var Bits: pointer;
var BitsSize: longint);
begin
BitmapInfo := nil;
InfoSize := 0;
Bits := nil;
BitsSize := 0;
ifnot Bitmap.Empty thentry
GetDIBSizes(Bitmap.Handle, InfoSize, BitsSize);
GetMem(BitmapInfo, InfoSize);
Bits := GlobalAllocPtr(GMEM_MOVEABLE, BitsSize);
if Bits = nilthenraise
EOutOfMemory.Create('Не хватает памяти для пикселей изображения');
ifnot GetDIB(Bitmap.Handle, Bitmap.Palette, BitmapInfo^, Bits^) thenraise Exception.Create('Не могу создать DIB');
exceptif BitmapInfo <> nilthen
FreeMem(BitmapInfo, InfoSize);
if Bits <> nilthen
GlobalFreePtr(Bits);
BitmapInfo := nil;
Bits := nil;
raise;
end;
end;
{ используйте FreeDIB для освобождения информации об изображении и битовых указателей }procedure FreeDIB(BitmapInfo: PBitmapInfo;
InfoSize: integer;
Bits: pointer;
BitsSize: longint);
beginif BitmapInfo <> nilthen
FreeMem(BitmapInfo, InfoSize);
if Bits <> nilthen
GlobalFreePtr(Bits);
end;
Создаем форму с TImage Image1 и загружаем в него 256-цветное изображение,
затем рядом размещаем TPaintBox. Добавляем следующие строчки к
private-объявлениям вашей формы:
Это поможет вам сделать первый шаг. Единственное, что вы можете захотеть, это
создание собственного HPalette на основе DIB, вместо использования TBitmap и
своей палитры. Функция с именем PaletteFromW3DIB из GRAPHICS.PAS как раз этим и
занимается, но она не объявлена в качестве экспортируемой, поэтому для ее
использования необходимо скопировать ее исходный код и вставить его в ваш
модуль.
Создание DIB из BMP: процесс преобразования файлов формата BMP в DIB и отображения с помощью модуля GRAPHICS.PAS и функций GetDIBSizes и GetDIB.
Комментарии и вопросы
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.