![]() |
Ein Bitmap invertieren
Hallo,
hiermit kann man die Farben eines Bitmaps invertieren. Hier bin ich davon ausgegangen, das auf dem Formular zwei Images liegen und Image1 wurde bereits ein Image über den OI zugewiesen.
Delphi-Quellcode:
Aufrufen dann so:
function InvertBmp(SourceBitmap: TBitmap): TBitmap;
var iFor, iFor2: LongInt; TempBitmap: TBitmap; bRed, bGreen, bBlue: Byte; PixelColor: LongInt; begin TempBitmap := TBitmap.Create; TempBitmap.Width := SourceBitmap.Width; TempBitmap.Height := SourceBitmap.Height; for iFor := 0 to SourceBitmap.Width -1 do begin for iFor2 := 0 to SourceBitmap.Height -1 do begin PixelColor := ColorToRGB(SourceBitmap.Canvas.Pixels[iFor, iFor2]); bRed := PixelColor; bGreen := PixelColor shr 8; bBlue := PixelColor shr 16; bRed := 255 -bRed; bGreen := 255 -bGreen; bBlue := 255 -bBlue; TempBitmap.Canvas.Pixels[iFor, iFor2] := (bRed shl 8 +bGreen) shl 8 +bBlue; end; end; Result := TempBitmap; end;
Delphi-Quellcode:
Jetzt einfach auf den Button klicken, dann wird das Bild/Bitmap aus dem Image1 invertiert und dann auch invertiert im zweiten Image also Image2 angezeigt.
procedure TForm1.Button1Click(Sender: TObject);
begin Image2.Picture.Bitmap.Assign(InvertBmp(Image1.Picture.Bitmap)); end; Grüsse, Daniel :hi: |
Re: Ein Bitmap invertieren
*brr* ist das ineffektiv!!! Ein Fall für Assembler/BASM!
Nahtrag: Invertieren ginge unter Umständen schneller mit einem:
Code:
Wobei wir die oberen 8bit unberührt lassen.
XOR Pixel, $FFFFFF
|
Re: Ein Bitmap invertieren
Sorry,
ich find das ist ein gutes Beipiel, wie man es nicht machen sollte. Zitat:
warum nutzt du hier nicht GetRValue etc? und fürs zurückrechnen RGB? bzw. warum nicht gleich über scanline gehen? ist viel schneller und du sparst dir die Umwandlung der Farbwerte. Dein Aufruf ist falsch, du schaffst dir ein Speicherloch. bei Invert erstellst du eine Bitmap und "assigned" die dann zur Image.bitmap damit wird die bei Invertbmp erstellte Bitmap nie wieder freigegeben. (kannst du mit Memproof ausprobieren) Wenn der Aufruf von InvertBMP so bleiben soll, mußt du trotzdem beim Buttonclick einen kleinen Umweg gehen.
Delphi-Quellcode:
Mfg Frank
procedure TForm1.Button1Click(Sender: TObject);
Var bmp:Tbitmap; begin bmp:=InvertBmp(Image2.Picture.Bitmap); Image1.Picture.Bitmap.Assign(bmp); bmp.Free; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:19 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz