Delphi-PRAXiS
Seite 1 von 3  1 23      

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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:49 Uhr.
Seite 1 von 3  1 23      

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