Советы по Delphi

         

Загрузка 256-цветного TBitmap


Windows не очень полезен, когда мы имеем дело с 256-цветными изображениями. Что делаю я (поскольку думаю, что это самый простой метод): я создаю в памяти изображение таким образом, чтобы TBitmap.LoadFromStream мог "принять" его. Данным методом я загружаю "сырой" ресурс изображения и размещаю его, используя инфорационный заголовок файла изображения. Вот потомок TBitmap, инкапсулирующий вышесказанное:

typeTMyBitmap = class(TBitmap)publicprocedure Load256ColorBitmap(Instance: THandle; BitmapName: PChar);end;
procedure TMyBitmap.Load256ColorBitmap(Instance: THandle;BitmapName: PChar);varHDib: THandle;Size: LongInt;Info: PBitmapInfo;FileHeader: TBitmapFileHeader;S: TMemoryStream;beginHDib := LoadResource(Instance, FindResource(Instance, BitmapName,RT_BITMAP));if HDib <> 0 thenbeginInfo := LockResource(HDib);Size := GetSelectorLimit(Seg(Info^)) + SizeOf(TBitmapFileHeader);with FileHeader dobeginbfType := $4D42;bfSize := Size;bfReserved1 := 0;bfReserved2 := 0;bfOffBits := SizeOf(TBitmapFileHeader) + SizeOf(TBitmapInfoHeader);case Info^.bmiHeader.biBitCount of1: bfOffBits := bfOffBits + 2 * 4;4: bfOffBits := bfOffBits + 16 * 4;8: bfOffBits := bfOffBits + 256 * 4;end;end;S := TMemoryStream.Create;tryS.SetSize(Size);S.Write(FileHeader, SizeOf(TBitmapFileHeader));S.Write(Info^, Size - SizeOf(TBitmapFileHeader));S.Position := 0;LoadFromStream(S);finallyS.Free;FreeResource(HDib);end;endelse raise EResNotFound.Create(Format('Не могу найти ресурс изображения %s',[BitmapName]));end;

Вот как можно это использовать:

Image1.Picture.Bitmap := TMyBitmap.Create;TMyBitmap(Image1.Picture.Bitmap).Load256ColorBitmap(hInstance, 'BITMAP_1');

-Steve Schafer [000709]



Содержание раздела