Hier de oplossing met het wijzigen van de Palette.
Het plaatje moet wel naar 8-bit omgezet worden voordat er een palette beschikbaar is, volgens mij.
Daarna moet je de precieze RGB waarden voor dat "rood" hebben want die index wil je wijzigen.
(bij mijn test met jouw plaatje was dat 51,51,255)
Quick en dirty testje:
Delphi Code:
procedure TForm.Button1Click(Sender: TObject);
var
Bmp: TBitmap;
NewCol: TRGBQuad;
OldCol: TRGBQuad;
i: Integer;
begin
Bmp := TBitmap.Create;
try
Bmp.LoadFromFile('c:\temp\test.bmp');
// voor een palette moet het plaatje omgezet zijn naar 8 bit
Bmp.PixelFormat := pf8Bit;
// even opslaan zodat je in het resulterende plaatje de precieze RGB-waarden op kunt zoeken
Bmp.SaveToFile('c:\temp\test2.bmp');
Image1.Picture.Assign(Bmp); // before
// voor een palette moet het plaatje omgezet zijn naar 8 bit
if Bmp.PixelFormat <> pf8Bit then
begin
Showmessage('ERROR, Bitmap is NOT 8 Bit');
Exit;
end;
NewCol.rgbBlue := 255;
NewCol.rgbGreen := 0;
NewCol.rgbRed := 0;
NewCol.rgbReserved := 0;
for i := 0 to 256 - 1 do
begin
// haal de kleur op uit index i uit de palette
if GetDIBColorTable(Bmp.Canvas.Handle, i, 1, OldCol) = 1 then
begin
// hier de precieze RGB waarden opgeven die je wilt veranderen
if (OldCol.rgbBlue = 51) and (OldCol.rgbGreen = 51) and (OldCol.rgbRed = 255) then
begin
bleep;
// zet de kleur op index i op de NewCol
if SetDIBColorTable(Bmp.Canvas.Handle, i, 1, NewCol) = 0 then
Showmessage(format('ERROR, System did not change palette-index %d, bitmap may be 24 bit', [i]));
end;
end;
end;
Image1.Picture.Assign(Bmp); // after
finally
Bmp.Free;
end;
end;
Bookmarks