Код, который вы разместили на самом деле ничего не делает. Вам нужно либо прочитать палитру обратно из растрового изображения, прежде чем вы сможете получить к ней доступ, либо вам нужно создать палитру и назначить ее растровому изображению - ваш код не выполняет ни одного.
Следующий код более или менее ваш, с полями fBitmap
и fBitmapPalEntries
для результатов операции. Я прокомментировал все строки, которые я изменил:
if OpenPictureDialog1.Execute then
begin
Screen.Cursor := crHourGlass;
try
Pal := nil;
try
S := TStringList.Create;
fBitmap.Free; // Release any existing bitmap
fBitmap := TBitmap.Create;
// if you want a 256 colour bitmap with a palette you need to say so
fBitmap.PixelFormat := pf8bit;
Image1.Picture.LoadFromFile( OpenPictureDialog1.Filename );
fBitmap.Canvas.Draw( 0, 0, Image1.Picture.Graphic );
// access the palette only if bitmap has indeed one
if fBitmap.Palette <> 0 then begin
GetMem( Pal, Sizeof( TLogPalette ) + Sizeof( TPaletteEntry ) * 255 );
Pal.palversion := $300;
Pal.palnumentries := 256;
// read palette data from bitmap
fBitmapPalEntries := GetPaletteEntries(fBitmap.Palette, 0, 256,
Pal.palPalEntry[0]);
for i := 0 to fBitmapPalEntries - 1 do
begin
AColor := Pal.PalPalEntry[ i ].PeRed shl 16
+ Pal.PalPalEntry[ i ].PeGreen shl 8
+ Pal.PalPalEntry[ i ].PeBlue;
N := ColorToString( AColor );
S.Add( N );
end;
// doesn't make sense, the palette is already there
// HPal := CreatePalette( Pal^ );
// fBitmap.Palette := HPal;
Memo1.Lines := S;
end;
finally; FreeMem( Pal ); end;
S.Free;
finally; Screen.Cursor := crDefault; end;
end;
Поддержка палитр с меньшим количеством записей проста, вам просто нужно перераспределить память после того, как вы знаете, сколько записей, что-то вроде
ReallocMem(Pal, SizeOf(TLogPalette) + SizeOf(TPaletteEntry) * (fBitmapPalEntries - 1));
Создание палитры будет необходимо, только если вы хотите написать растровое изображение в формате pf4Bit
или pf8Bit
. Вам нужно будет определить 16 или 256 цветов, которые являются записями палитры, возможно, за счет уменьшения количества цветов (сглаживание). Затем вы должны заполнить палитру цветов в слотах значениями цвета и, наконец, использовать две строки, которые я закомментировал из вашего кода. Вы должны убедиться, что формат пикселя растрового изображения и количество записей палитры совпадают.