Sources
Delphi Russian Knowledge Base
DRKB - это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым

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

01.01.2007

Автор: Steve Schafer

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

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

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

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

Взято с https://delphiworld.narod.ru