Mastodon
Programmierung

Bitmap: Alpha blending

Here’s the code.

This is particularly neat to use if you want to place text on a bitmap and
guarantee that the text is readable without completely obscuring the image
underneath; simply tint the area underneath the text with clBlack, then draw
clWhite text on top (with Canvas.Brush.Style = bsClear).

Note that the TintBitmapRect procedure below requires that you’re using
pf32Bit bitmaps. It can be modified to work with other pixel formats, but
that is an exercise for the reader.

[code lang=”delphi”]{
TColors have color components in blue-green-red order.
32-bit bitmap pixels have color components in red-green-blue order.
This function allows conversion between the two orders.
}
function SwapRedBlue(const Color: TColor): TColor;

begin
Result := (Color and $FF0000) shr 16 or
(Color and $00FF00) or
(Color and $0000FF) shl 16;
end;

{
Tint an arbitrary rectangular area of a bitmap with an arbitrary color.

Author: Gary Williams, gw (at) gw (dot) ro
}
procedure TintBitmapRect(const Bitmap: TBitmap;
const Rect: TRect;
const Color: TColor);

var
Pixel: PLongWord;

I: Integer;
J: Integer;

Color2: LongWord;

const
Mask: LongWord = $00FEFEFE;

begin
Assert(Bitmap.PixelFormat = pf32Bit);

Color2 := SwapRedBlue(Color) and Mask;

for I := Rect.Top to (Rect.Bottom – 1) do
begin
Pixel := Bitmap.ScanLine[I];
Inc(Pixel, Rect.Left);

for J := Rect.Left to (Rect.Right – 1) do
begin
Pixel^ := ((Pixel^ and Mask) + Color2) shr 1;
Inc(Pixel);
end;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);

begin
with Image1.Picture do
begin
Bitmap.PixelFormat := pf32Bit;

TintBitmapRect(Bitmap,
Rect(Bitmap.Width div 4,
Bitmap.Height div 4,
Bitmap.Width – Bitmap.Width div 4,
Bitmap.Height – Bitmap.Height div 4),
clRed);
end;
end;
[/code]

[tags]Delphi, Graphic[/tags]

0 Kommentare zu “Bitmap: Alpha blending

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.