![]() |
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:
geht das ganze nur, wenn der Erste punkt, also der MouseDown-Punkt auf dem Canvas der OBEN LINKS ist.
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; ich habe dann folgendes geschrieben:
Delphi-Quellcode:
Das geht "natürlich" wunderbar, aber ich frage mich, warum die andere Version nicht funktioniert.
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; Wäre schön, wenn das jemand beantworten könnte. |
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 |
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 |
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 ^^ |
Re: Farben ersetzen
Zitat:
|
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? |
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? |
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 |
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.
|
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 12:41 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