Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Einige Fragen zu graphics32 (https://www.delphipraxis.net/52948-einige-fragen-zu-graphics32.html)

nano 7. Sep 2005 12:14


Einige Fragen zu graphics32
 
Moin moin, Kollege =)

Arbeite gerade an einem Projekt mit graphics32 und gleich ein Paar Fragen:

1.) Der Benutzer soll einfache Elemente (Linie, Rechteck,..) zeichnen können. Dazu werden zwei Ebenen erstellt: In der einen wird das fertige Bild gezeichnet, in der zweiten nur temporäre Bilder (Wenn der Benutzer beispielsweise bei gedrückter Maustaste ein Rechteck festlegt). Dabei muss die temporäre Ebene stets gelöscht und neu gezeichnet werden.

Allerdings übermalt die Prozedure Clear(); alle anderen ebenen mit Schwarz, obwohl ich DrawMode auf dmBlend gesetzt habe.

Wie kann man die Ebene säubern ohne sie mit Farbe zu füllen? Damit man die darunterliegenden Ebenen nicht übermalt





2.) Es soll nur ein bestimter Bereich des Bildes ausgeschnitten werden. Dazu wird eine Ebene erstellt, die das Auswahlmuster enthält (Bsp: Kreis). Nun soll der vom Kreis überdeckter Bereich aus der darunterliegender Ebene in ein anderes Bitmap kopiert werden. Wie ist das möglich?

dizzy 7. Sep 2005 13:57

Re: Einige Fragen zu graphics32
 
Mahlzeit!

Zitat:

Zitat von nano
Allerdings übermalt die Prozedure Clear(); alle anderen ebenen mit Schwarz, obwohl ich DrawMode auf dmBlend gesetzt habe.

Wie kann man die Ebene säubern ohne sie mit Farbe zu füllen? Damit man die darunterliegenden Ebenen nicht übermalt

TBitmap32.Clear gibt es in 2 überladenen Versionen. Eine davon bietet dir die Möglichkeit die Füllfarbe zu definieren:
Delphi-Quellcode:
  MyBmp.Clear(Color32(r, g, b, ALPHA));
Die Angabe von "Alpha" ist optional, und Standardwert ist "voll deckend". Das ist dein Kandidat :)


Zitat:

Zitat von nano
2.) Es soll nur ein bestimter Bereich des Bildes ausgeschnitten werden. Dazu wird eine Ebene erstellt, die das Auswahlmuster enthält (Bsp: Kreis). Nun soll der vom Kreis überdeckter Bereich aus der darunterliegender Ebene in ein anderes Bitmap kopiert werden. Wie ist das möglich?

Zunächst mal einfach via TBitmap32.Draw{To}. Dabei gibt es massig überladene Versionen die verschiedene Angaben zu Positionierung und Größe ermöglichen. Das Ausmaskieren des Kreises wirst du von Hand machen müssen. Ein Ansatz: Erstelle ein s/w-Bitmap in der Größe deines Kreises und zeichne ihn (gefüllt) rein. Dann nimmst du deinen o.g. kopiertes Bitmap, und belegst es mit "IntensityToAlpha()" (-> Hilfe zur G32) mit eben diesem s/w-Bild als Alphamaske. Anschließend dieses Bild, dass die maskierte Kopie enthält, auf dein Zielbitmap zeichnen (auf dmBlend achten!).


Gruss,
Fabian

nano 7. Sep 2005 14:45

Re: Einige Fragen zu graphics32
 
Zitat:

Zitat von dizzy
Mahlzeit!

Zitat:

Zitat von nano
Allerdings übermalt die Prozedure Clear(); alle anderen ebenen mit Schwarz, obwohl ich DrawMode auf dmBlend gesetzt habe.

Wie kann man die Ebene säubern ohne sie mit Farbe zu füllen? Damit man die darunterliegenden Ebenen nicht übermalt

TBitmap32.Clear gibt es in 2 überladenen Versionen. Eine davon bietet dir die Möglichkeit die Füllfarbe zu definieren:
Delphi-Quellcode:
  MyBmp.Clear(Color32(r, g, b, ALPHA));
Die Angabe von "Alpha" ist optional, und Standardwert ist "voll deckend". Das ist dein Kandidat :)

Undefinierter Bezeichner "Alpha", oder hab ich was falsch gemacht?

Clear(Color32(0, 0, 0, ALPHA));




ps: Mit dem Ausmaskieren warte ich noch, da ich jetzt einen komplett anderen Ansatz ausprobieren möchte! Danke!!

nano 7. Sep 2005 14:47

Re: Einige Fragen zu graphics32
 
Oops! Alpha ist vom Typ Byte 255... Hab jetzt auch auf null gesetzt und es funzt, danke! =)

Aber was genau bewirkt der Wert von Alpha?

DGL-luke 7. Sep 2005 14:59

Re: Einige Fragen zu graphics32
 
"Alpha" ist der in Grafikerkreisen übliche Begriff für "Transparenz". Je höher die Tranparenz, desto durchscheinender. ein Glasfenster hat idealerweise eine Transparenz von 255 bzw. 100% ;)

(bw: falls dir mal "Gamma" über den Weg laufen sollte, das ist der Wert für die Helligkeitskorrektur ;) )

SMO 7. Sep 2005 15:06

Re: Einige Fragen zu graphics32
 
Zitat:

Zitat von DGL-luke
"Alpha" ist der in Grafikerkreisen übliche Begriff für "Transparenz". Je höher die Tranparenz, desto durchscheinender. ein Glasfenster hat idealerweise eine Transparenz von 255 bzw. 100% ;)

Genau andersherum. Der Alpha-Wert bestimmt üblicherweise nicht die Transparenz, sondern die "opacity" (Opazität/Undurchsichtigkeit/Deckfähigkeit). Wenn ein Glasfenster Alpha = 255 bzw. 100% hat, ist es also total undurchsichtig. Alpha = 0 wäre total durchsichtig. ;)

nano 7. Sep 2005 20:45

Re: Einige Fragen zu graphics32
 
Danke! Hat wunderbar geklappt...

Nun ne andere Frage:

Kann ich den Zeichenbereich abgrenzen?
Image32 verhält sich komisch: Wenn der Endpunkt einer Linie außerhalb des Bitmaps liegt erfolgt entweder ein Exeption Fehler oder er zeichnet auf der linken seite des Bitmaps wieder weiter...

dizzy 8. Sep 2005 00:55

Re: Einige Fragen zu graphics32
 
TBitmap32 bietet allein 14 Methoden um eine Linie zu zeichnen. Dazu kommen noch die Varianten für LineTo, und man kann auch noch über den Canvas die aus TBitmap bekannte LineTo-Methode verwenden. Welche davon nimmst du?
Alle die ein 'S' in den hinteren Großbuchstaben haben, prüfen ob ausserhalb des gültigen Bereichs gezeichnet werden soll. Alle anderen malen munter weiter (ausser die Methode von Canvas imho), und je nach dem wie du grad Pech hast zeichnen sie in Speicherbereiche die schon nicht mahr zum Bitmap gehören (-> Exception), oder (da das Bitmap ein 1-dimensionales DWord-Array ist) in die nächste Zeile.

Alles was ich bisher gesagt habe lässt sich im Übrigen in der (wie ich finde ziemlich guten) Hilfe zur G32 nachlesen :zwinker:. (Sie ist direkt im G32-Ordner; über die Delphi-IDE via F1 lässt sie sich nicht starten.)

Gruss,
Fabian

nano 8. Sep 2005 08:38

Re: Einige Fragen zu graphics32
 
Hallo

ich nutze die Line() Methode, weil sie auch den letzen Pixel der Linie mitzeichnet

Mit LineToS, LineToAS, LineToTS (wo da der Unterschied liegt, hab ich auch mit Hilfe der Anleitung nicht verstanden) entstehen Lücken.

Was gibts da noch?

nano 8. Sep 2005 08:41

Re: Einige Fragen zu graphics32
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hier ein Beispiel für die Lücken =)


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:24 Uhr.
Seite 1 von 2  1 2      

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