Willst du das wirklich wissen?
Ich stelle dir hier mal einen Teil einer Procedure von mir rein, welche bestimmte Farben in einem Bitmap umfärbt. Ich stelle den Teil für die palettenbasierten Bitmaps rein, ich denke damit solltest du genug Ideen bekommen. Ansonsten nochmal nachfragen.
Delphi-Quellcode:
// changes given color in bitmap to new one
Procedure MapColor(Const ABitmap : TBitmap; Const AOldColor, ANewColor : TColor);
Var
i, j,
// 2, 16, 256 Colors
lPaletteEntries : Integer;
lPalette : TDIBPalette;
lLastGDIObj : HGDIOBJ;
// Old Color, New Color
lQuadOldColor,
lQuadNewColor : TRGBQuad;
lWordOldColor,
lWordNewColor : Word;
Begin
Assert(Assigned(ABitmap), 'MapColor(): ABitmap is not assigned!');
lQuadOldColor.rgbRed := GetRValue(ColorToRGB(AOldColor));
lQuadOldColor.rgbGreen := GetGValue(ColorToRGB(AOldColor));
lQuadOldColor.rgbBlue := GetBValue(ColorToRGB(AOldColor));
lQuadOldColor.rgbReserved := 0;
lQuadNewColor.rgbRed := GetRValue(ColorToRGB(ANewColor));
lQuadNewColor.rgbGreen := GetGValue(ColorToRGB(ANewColor));
lQuadNewColor.rgbBlue := GetBValue(ColorToRGB(ANewColor));
lQuadNewColor.rgbReserved := 0;
If ( ABitmap.PixelFormat In [pf1Bit, pf4Bit, pf8Bit] ) Then
Begin
lLastGDIObj := SelectObject(ABitmap.Canvas.Handle, ABitmap.Handle);
Try
lPaletteEntries := GetDIBColorTable(ABitmap.Canvas.Handle, 0, 256, lPalette);
If ( lPaletteEntries > 0 ) Then
Begin
For i := 0 To ( lPaletteEntries - 1 ) Do
Begin
If ( ( lPalette[i].rgbRed = lQuadOldColor.rgbRed ) And
( lPalette[i].rgbGreen = lQuadOldColor.rgbGreen ) And
( lPalette[i].rgbBlue = lQuadOldColor.rgbBlue ) ) Then
lPalette[i] := lQuadNewColor;
End;
SetDIBColorTable(ABitmap.Canvas.Handle, 0, lPaletteEntries, lPalette);
End;
Finally
SelectObject(ABitmap.Canvas.Handle, lLastGDIObj);
End;
End
Else // kein Farbtabellen-Bitmap (15 Bit und höher)
begin
// *schnipp*
end;
end;