AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Ein Bitmap invertieren

Ein Thema von Daniel B · begonnen am 20. Jul 2003 · letzter Beitrag vom 20. Jul 2003
Antwort Antwort
Daniel B
(Gast)

n/a Beiträge
 
#1

Ein Bitmap invertieren

  Alt 20. Jul 2003, 10:52
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:
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;
Aufrufen dann so:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  Image2.Picture.Bitmap.Assign(InvertBmp(Image1.Picture.Bitmap));
end;
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.

Grüsse, Daniel
  Mit Zitat antworten Zitat
Gast
(Gast)

n/a Beiträge
 
#2

Re: Ein Bitmap invertieren

  Alt 20. Jul 2003, 12:43
*brr* ist das ineffektiv!!! Ein Fall für Assembler/BASM!

Nahtrag: Invertieren ginge unter Umständen schneller mit einem:

Code:
XOR Pixel, $FFFFFF
Wobei wir die oberen 8bit unberührt lassen.
  Mit Zitat antworten Zitat
Keldorn

Registriert seit: 6. Mär 2003
Ort: Meißen
876 Beiträge
 
Delphi 10.1 Berlin Professional
 
#3

Re: Ein Bitmap invertieren

  Alt 20. Jul 2003, 12:53
Sorry,

ich find das ist ein gutes Beipiel, wie man es nicht machen sollte.

Zitat:
bRed := PixelColor;
bei aktivierter Bereichsprüfung machts bum, da du versuchst, einem Byte einen longint-Wert versuchst zuzuweisen.
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:
procedure TForm1.Button1Click(Sender: TObject);
Var bmp:Tbitmap;
begin
 bmp:=InvertBmp(Image2.Picture.Bitmap);
 Image1.Picture.Bitmap.Assign(bmp);
 bmp.Free;
end;
Mfg Frank

Lükes Grundlage der Programmierung:
Es wird nicht funktionieren
(Murphy)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:33 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz