Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Farben ersetzen (https://www.delphipraxis.net/42499-farben-ersetzen.html)

Jarmen_Kell 19. Mär 2005 19:25


Farben ersetzen
 
Hallo,
also ich weiß, die Frage ist mal wieder auf etwas tieferem Niveau, aber irgendwie komm ich nicht dahinter.
Die folgende Prozedur soll in einem Bestimmten Bereich auf einem TCanvas alle Pixel, die eine bestimmte Farbe haben, durch eine andere Farbe ersetzen.
Der Bereich wird durch MouseDown und MouseUp auf dem Image festgelegt.
Bei dieser Prozedur:

Delphi-Quellcode:
procedure Tmainform.colorchange;
var
  Ix,Iy:Integer;
begin
  for Ix:=moused.X to current.X do
    for Iy:=moused.Y to current.Y do
      if img.Canvas.Pixels[Ix,Iy]=pencolor
        then img.Canvas.Pixels[Ix,Iy]:=brushcolor;
end;
geht das ganze nur, wenn der Erste punkt, also der MouseDown-Punkt auf dem Canvas der OBEN LINKS ist.

ich habe dann folgendes geschrieben:

Delphi-Quellcode:
procedure Tmainform.colorchange;
var
  Ix,Iy:Integer;
  x1,x2,y1,y2:Integer;
begin
  if moused.X < current.X then x1:=moused.X else x1:=current.X;
  if moused.Y < current.Y then y1:=moused.Y else y1:=current.Y;
  if moused.X < current.X then x2:=current.X else x2:=moused.X;
  if moused.Y < current.Y then y2:=current.Y else y2:=moused.Y;
  for Ix:=x1 to x2 do
    for Iy:=y1 to y2 do
      if img.Canvas.Pixels[Ix,Iy]=pencolor
        then img.Canvas.Pixels[Ix,Iy]:=brushcolor;
end;
Das geht "natürlich" wunderbar, aber ich frage mich, warum die andere Version nicht funktioniert.
Wäre schön, wenn das jemand beantworten könnte.

Dust Signs 19. Mär 2005 19:30

Re: Farben ersetzen
 
Vielleicht, weil die Schleifen u.U. in die falsche Richtung laufen? Btw würd ich Scanline verwenden - das ist im einiges schneller als Pixels

Dust Signs

Pr0g 19. Mär 2005 19:31

Re: Farben ersetzen
 
Es wird wohl an deiner For-Schleife liegen. Bei "for ... to ..." muss der erste Wert niedriger, als der zweite sein, sonst gehts nicht. Für die andere Variante gäbe es "for ... downto ...".

Meintest du das?

MfG Pr0g

Jarmen_Kell 20. Mär 2005 12:57

Re: Farben ersetzen
 
Hmm, ja ach so, ich wusste nicht, dass das nicht bei 'nem niedrigerem Wert automatisch runterzählt
also muss ich doch erstmal den kleineren ermitteln und dann.
Naja

Aber jetzt würde mich mal interessieren, was "scanline" ist ^^

Pr0g 20. Mär 2005 13:16

Re: Farben ersetzen
 
Zitat:

Zitat von Jarmen_Kell
Aber jetzt würde mich mal interessieren, was "scanline" ist ^^

Mit Scanline kannst du wie mit Pixels auf die einzelnen Pixel zugreifen, nur das es um einiges schneller ist. Aber da solltest du mit der Boardsuche genug finden können ;)

Jarmen_Kell 21. Mär 2005 10:20

Re: Farben ersetzen
 
hmm ja, jetzt hab ich mich da n bisserl eingelesen und hab auch schon allerlei an Source gefunden, aber wie es scheint, geht das nur mit TBitmaps?!?
Also ich brauch' das ganze zumindest letztendlich für'n Canvas.
Und einfach umschreiben scheint nicht so ganz zu klappen ;)

Naja bestimmt gehts doch ganz einfach, aber ich komm' nicht drauf und bin ja auch noch recht "neu" ^^

Also, kann mir jemand das ganze für'n Canvas erklären?

Pr0g 21. Mär 2005 12:17

Re: Farben ersetzen
 
Wenn du Pixelweise mit Canvas drauf zugreifen willst, wird es im Gegensatz zu Scanlein sehr langsam.

Welches Bildformat willst du denn sonst nehmen, wenn nicht TBitmap?

Jarmen_Kell 21. Mär 2005 17:12

Re: Farben ersetzen
 
hmm naja wie gesagt, das ist ein TImage und auf dem Canvas wird herumgemalt.
Ist also Quasi ne Art Paint.
Und diese Farb-Wechsel-Funktion ist mir eingefallen, und dann wollt' ich die eben auch noch einfügen

Khabarakh 21. Mär 2005 17:22

Re: Farben ersetzen
 
Du solltest eigentlich alle Zeichenoperationen auf einem Bitmap durchführen und dessen Inhalt dann im OnPaint in eine Paintbox kopieren. Das ist der Performance-beste Weg, nicht zuletzt eben wegen Scanline.

Pr0g 21. Mär 2005 17:22

Re: Farben ersetzen
 
Aufs Canvas des Image solltest du nicht zeichnen. Zeichen auf ein ein Bitmap (bzw. dessen Canvas). Dann hast du auch wieder Scanline.

Jarmen_Kell 21. Mär 2005 20:37

Re: Farben ersetzen
 
Warum sollte ich das nicht tun?

Und: wie geht das ScanLine dann?

Pr0g 21. Mär 2005 22:25

Re: Farben ersetzen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Webb du auf ein Image direkt zeichnest kann es zu fehlern kommen. Für sowas ist die Paintbox gedacht.

Hab dir hier mal ein kleines Beispiel gemacht. Zuerst wird ein Bitmap erzeugt und drauf gezeichnet. Als nächstes wird mit Scanline und zwei Schleifen jedes Pixel geprüft und wenns Blau ist in Rot geändert.

Jarmen_Kell 22. Mär 2005 11:16

Re: Farben ersetzen
 
Liste der Anhänge anzeigen (Anzahl: 1)
ok, muss ich dann das ganze hier ( Anhang ) umschreiben?

evtl TImage mit TPaintbox ersetzen?!?

Und geht das dann auch noch alles?

Anhang:
|~|
paeint.zip

Pr0g 22. Mär 2005 12:25

Re: Farben ersetzen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich würde das TImage wegmachen und alle Operationen (Zeichnen, Laden, speichern...) auf ein TBitmap anwenden. (Ich glaube für das Undo nutzt du auch ein Image, dafür kannst du sowieso ein TBitmap nutzen). Dann kannst du das TBitmap per BitBlt auf deine Form blitten, musst nur nach jeder Zeichenoperation das onPaint der Form, oder PaintBox aufrufen. Ich habe nochmal ein Beispiel gemacht.

Jarmen_Kell 22. Mär 2005 13:06

Re: Farben ersetzen
 
Also doch mehr oder weniger alles umschreiben ..
naja dann fang' ich mal an ^^

( aber ich bin mir sicher, dass ich demnächst wieder was davon fragen werde ;) )

Danke schon mal !

ferby 11. Feb 2006 20:12

Re: Farben ersetzen
 
Hallo,

Bei mir funktioniert der Quellcode nicht.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  x,y: integer;
  fLine: PRGBQuad;
begin
  for y := 0 to Grafik.Height - 1 do
  begin
    fLine := Grafik.ScanLine[y];
    for x := 0 to Grafik.Width - 1 do
    begin
      if (fLine.rgbBlue = 255) and (fLine.rgbGreen = 255) and (fLine.rgbRed = 255) then
      begin
        fLine^.rgbBlue := 0;
        fLine^.rgbGreen := 0;
        fLine^.rgbRed := 255;
      end;
    Inc(fLine);
    end;
  end;

  FormPaint(NIL);
end;
Delphi-Quellcode:
procedure TForm1.FormPaint(Sender: TObject);
begin
  BitBlt(pbox.Canvas.Handle, 0, 0, Grafik.Width, Grafik.Height, Grafik.Canvas.Handle, 0, 0, SrcCopy);
end;
und im oncreat steht

Delphi-Quellcode:
  with grafik do
  begin
    Height:=200;
    Width:=200;
    canvas.pen.color:=clwhite;
    canvas.brush.color:=clwhite;
    canvas.Rectangle(0,0,200,200);
  end;

wobei grafik: TBitmap; ist.

Ich will das die Weiße Fläche die Farbe Rot animmt.
Die Schleife wird ausgeführt, nur es ändert sich nichts.

Warum?

Pr0g 12. Feb 2006 01:44

Re: Farben ersetzen
 
Hast du das Pixelformat von "grafik" auf 32Bit gesetzt, nach dem Create?
Delphi-Quellcode:
grafik.PixelFormat := pf32Bit;

ferby 12. Feb 2006 09:37

Re: Farben ersetzen
 
Hallo,

Nein habe ich nicht,
danke funktioniert jetzt alles,

was heißt diese Zeile?

Khabarakh 12. Feb 2006 09:57

Re: Farben ersetzen
 
Nun ja, das Pixelformat wird eben auf 32 Bit (ARGB) gesetzt :wink: . Da in der Prozedur tagRGBQUAD, also 4 Byte pro Pixel, benutzt wird, muss das Bitmap auch genau dieses Format haben.

ferby 21. Feb 2006 18:49

Re: Farben ersetzen
 
Hallo,

ich möchte die Prozedur so umschreiben das ich statt den drei RGB Werten einen Integer Wert bekomme.
Jede Farbe hat in Delphi seinen eigenen Integer Wert, wie bekomme ich den aus den RGB Werten?


Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  x,y: integer;
  fLine: PRGBQuad;
begin
  for y := 0 to Grafik.Height - 1 do
  begin
    fLine := Grafik.ScanLine[y];
    for x := 0 to Grafik.Width - 1 do
    begin
      if (fLine.rgbBlue = 255) and (fLine.rgbGreen = 255) and (fLine.rgbRed = 255) then
      begin
        fLine^.rgbBlue := 0;
        fLine^.rgbGreen := 0;
        fLine^.rgbRed := 255;
      end;
    Inc(fLine);
    end;
  end;
end;

wie bekomme ich daraus:

Delphi-Quellcode:
        fLine.rgbBlue := 0;
        fLine.rgbGreen := 0;
        fLine.rgbRed := 255;
einen einzigen Integer Wert???

ferby 22. Feb 2006 19:14

Re: Farben ersetzen
 
Hi,


kann mir keiner helfen??????

:(

Khabarakh 22. Feb 2006 19:32

Re: Farben ersetzen
 
Ich hoffe mal, dass ich TColor nicht verdreht habe:
Delphi-Quellcode:
Color := Reserved shl 24 or Blue shl 16 or Green shl 8 or Red;

ferby 25. Feb 2006 19:03

Re: Farben ersetzen
 
Hallo,

ich wollte gerade deine Mehtode ausprobieren ob sie hinhaut,
leider kommt eine Fehlermeldung

[Fehler] Unit1.pas(137): Undefinierter Bezeichner: 'Reserved'


Kannst du mir weiter helfen?


Ferby

turboPASCAL 25. Feb 2006 22:29

Re: Farben ersetzen
 
Reserved ist wie Rot, Grün und Blau nur ein "Platzhalter" um die Vohrgehensweise darzustellen.
Code:
procedure ...
var
  Reserved, Rot, Gruen, Blau : Byte;

  Color: Tcolor;
begin
  Reserved := $00; // Ist reserviert für Systemfarben

  // Aufbau TColor = Longint bzw. Cardinal = $00[color=#0000ff]00[/color][color=#00ff00]00[/color][color=#ff0000]00[/color]
 
  Rot  := 50;
  Blau := 128;
  Gruen := 255;

  Color := Reserved shl 24 or Blue shl 16 or Green shl 8 or Red;

end;
Delphi-Quellcode:
function RGB(R,G,B: Byte): Cardinal;
begin
  Result := $00000000 shl 24 or B shl 16 or G shl 8 or R;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:50 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