Delphi-PRAXiS
Seite 4 von 6   « Erste     234 56      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Bitmap32 auf ZielBitmap32 malen (https://www.delphipraxis.net/117988-bitmap32-auf-zielbitmap32-malen.html)

turboPASCAL 31. Jul 2008 02:59

Re: Bitmap32 auf ZielBitmap32 malen
 
Zitat:

Aber ich tippe zunächst mal auf den DrawMode.
Da tipp ich auch drauf.
Zitat:

Zitat von stOrM
Kann ich machen, ich kann dir auch das Project senden wie du magst?

Häne es doch einfach mal an.

stOrM 31. Jul 2008 08:23

Re: Bitmap32 auf ZielBitmap32 malen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich häng mal :-)

Obwohl ich schon mal mit dmBlend sowie Combinemode oder so, mein ich mich zu erinnern, rumgefummelt hab, was auch nicht geholfen hatte, jedenfalls nicht bei mir :-(

Viele Grüße
Marc

DeddyH 31. Jul 2008 08:30

Re: Bitmap32 auf ZielBitmap32 malen
 
Es wäre ja interessant zu ergründen, wann dieses Pixel erscheint. Testhalber würde ich zunächst die konvertierten TBitmap32 (vor dem Skalieren) einmal zusammenfügen und als Datei speichern. Kommt es da schon, dürfte es bereits am Konvertieren liegen.

stOrM 31. Jul 2008 08:41

Re: Bitmap32 auf ZielBitmap32 malen
 
Zitat:

Zitat von DeddyH
Es wäre ja interessant zu ergründen, wann dieses Pixel erscheint. Testhalber würde ich zunächst die konvertierten TBitmap32 (vor dem Skalieren) einmal zusammenfügen und als Datei speichern. Kommt es da schon, dürfte es bereits am Konvertieren liegen.

Hab ich grad mal getestet nu iss alles komplett schwarz, ohne Skalierung, ich kuck nochmal drüber aber eventuell stimmt die Größe grad nicht

In einen anderen Forum sprach jemand von einem ähnlichem Problem ich zitiere mal:

Zitat:

Ich benutze in meinem Programm die Gr32-Lib und möchte mehrere Bitmap32 (Ich nenne sie mal Layer) in ein großes Bitmap32 zeichnen. Diese Layer sind aber nicht rechteckig, sodass logischerweise ein schwarzes Rechteck um meinen Layer erscheint.
Ich bräuchte jetzt irgendeinen Weg, von dem neuen Layer nur die Pixel zu zeichnen, die nicht $FF000000 sind.

Optimal wäre natürlich so etwas wie prozedur(Quelle,Ziel,Farbe) ^^
Zitat:

Hab eine Antwort gefunden.. falls die nochmal jemand braucht:
Bitmap32's haben eine Eigenschaft namens DrawMode, die muss nur für jeden Layer auf dmTransparent gestellt werden.
Hab ich aber ebenfalls hinter mir geht auch nicht, bzw bleibt da die Frage offen welcher Bitmap32 bekommt dmTransparent? der Letzte? alle?

Medium 31. Jul 2008 14:04

Re: Bitmap32 auf ZielBitmap32 malen
 
Zu aller erst: Deine Variable "Alpha" ist nicht initialisiert, wodurch du nicht sicher sein kannst ob du nun das PNG mit oder ohne Alphakanal liest!

Dann sollte der DrawMode des Bitmaps auf dmBlend gesetzt werden, welches als Quelle dient. Also entweder das, das in der Methode Draw() als Parameter benutzt wird, bzw. das dessen Methode DrawTo() aufgerufen wird. Im Zweifel einfach bei allen.

Das nächste Problem ist, dass dein Alphakanal durch das Strecken ebenfalls gestreckt wird, und somit "verwischt", so dass du nachher in den Ecken nicht mehr den Aplhawert 0 hast, sondern irgendetwas leicht höheres. Andere Stretchfilter als Mitchell könnten hier stabiliere Ergebnisse liefern, aber du wirst vermutlich immer einen dunklen Schimmer in den Ecken zurück behalten.

Und zu guter letzt scheint die G32 beim Zeichnen auf nicht-G32 Canvases den ALphawert nicht korrekt zu berücksichtigen. In dem Fall kann es evtl. helfen den DrawMode dmCustom zu benutzen, und das OnPixelCombine Event selbst zu implementieren. Weil in den Pixeldaten der Bitmaps steht der Alphakanal drin, er wird offenbar nur in diesem Fall nicht beachtet.


Aber egal wie du es anstellst, wirst du mit dieser Methode immer Probleme mit dem verwischen des Aplhakanals zu kämpfen haben, ausser du benutzt den NearestNeighbor Filter der nur leider reichlich hässlich ist =)
Ich würde dir daher emfehlen den Verlauf incl. des Alphakanals zur Laufzeit in Delphi zu zeichnen, und zwar in genau der gebrauchten Größe. Das musst du ja zudem nur ein einziges Mal machen wenn sich die größe der Listbox Items verändert, und kannst es dann wie jetzt auch aus einem Puffer-Bitmap immer wieder schnell zeichnen. (Dafür muss nur das Problem mit dem Zeichnen mit Alpha gelöst werden (dmCustom).)

stOrM 31. Jul 2008 14:38

Re: Bitmap32 auf ZielBitmap32 malen
 
Öhm ja,
da trifft es sich doch wieder extrem gut, dass ich davon 0 in worten null Ahnung hab :-(
Kannst Du mir für deine letzten Worte:
Zitat:

Ich würde dir daher emfehlen den Verlauf incl. des Alphakanals zur Laufzeit in Delphi zu zeichnen, und zwar in genau der gebrauchten Größe. Das musst du ja zudem nur ein einziges Mal machen wenn sich die größe der Listbox Items verändert, und kannst es dann wie jetzt auch aus einem Puffer-Bitmap immer wieder schnell zeichnen. (Dafür muss nur das Problem mit dem Zeichnen mit Alpha gelöst werden (dmCustom).)
mal das Codetechnisch verdeutlichen? (jaja nicht meckern wegen Codebettelleien hier :-)

Viele Grüsse
Marc

DeddyH 31. Jul 2008 15:01

Re: Bitmap32 auf ZielBitmap32 malen
 
Na, Du erstellst Dir eine Bitmap im Speicher und zeichnest darauf. OnPaint zeichnest Du diese Bitmap nun "in einem Rutsch" auf den Zielcanvas. Wenn sich dessen Größe ändert (und das ist auch nur dann notwendig), erstellst Du diese Bitmap in der passenden Größe neu. Dasselbe Prinzip habe ich z.B. bei meinem runden Button angewendet, kannst es Dir ja mal ansehen (OK, da wird GDI+ verwendet, aber das Prinzip ist ja das gleiche).

stOrM 31. Jul 2008 15:07

Re: Bitmap32 auf ZielBitmap32 malen
 
Zitat:

Zitat von DeddyH
Na, Du erstellst Dir eine Bitmap im Speicher und zeichnest darauf. OnPaint zeichnest Du diese Bitmap nun "in einem Rutsch" auf den Zielcanvas. Wenn sich dessen Größe ändert (und das ist auch nur dann notwendig), erstellst Du diese Bitmap in der passenden Größe neu. Dasselbe Prinzip habe ich z.B. bei meinem runden Button angewendet, kannst es Dir ja mal ansehen (OK, da wird GDI+ verwendet, aber das Prinzip ist ja das gleiche).

Ja ok soweit klar nur wat issn dann mit Transparenz?
Abgesehen davon ich hab grad die beiden Ecken nicht gestretched trotzdem das gleiche, es sieht also so aus:
Zitat:

G32 beim Zeichnen auf nicht-G32 Canvases den ALphawert nicht korrekt zu berücksichtigen
Nur dagegen bin ich machtlos!

Btw.
Sagmal dann kennst Du dich doch bestimmt super mit GDI+ aus oder? Wegen deinem runden Button, ich meine ich muss ja nicht Gr32 nehmen? Ginge das nicht auch so, dass man sich über die GDI erstmal sowas wie ein RoundRect baut mit einer bestimmten Rahmanfarbe halt oder man füllt es halt mit entsprechender Farbe, dann lässt man nen Pixel frei, und zeichnet darin dann per GDI+ den Gradient?
Viel mir grad so ein weil mich zwingt ja keiner ne Grafik zu nehmen ich dachte nur es wäre vielleicht leichter?!

DeddyH 31. Jul 2008 15:21

Re: Bitmap32 auf ZielBitmap32 malen
 
Super auskennen wäre nun wirklich zuviel gesagt. Ich würde Dir empfehlen, Dir aus meinem Button-Thread den kompletten Source zu laden, da sind reichlich Beispiele dabei (nicht von mir). Die hatte ich mir auch ausgiebig angesehen und dann mit den Möglichkeiten herumgespielt.

stOrM 31. Jul 2008 15:28

Re: Bitmap32 auf ZielBitmap32 malen
 
Zitat:

Zitat von DeddyH
Super auskennen wäre nun wirklich zuviel gesagt. Ich würde Dir empfehlen, Dir aus meinem Button-Thread den kompletten Source zu laden, da sind reichlich Beispiele dabei (nicht von mir). Die hatte ich mir auch ausgiebig angesehen und dann mit den Möglichkeiten herumgespielt.

Naja ich glaub nicht das ich das hinbekomme, hab mir deinen Source mal heruntergeladen...


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:45 Uhr.
Seite 4 von 6   « Erste     234 56      

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