AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia PNG und Canvas via BMP und anderes
Thema durchsuchen
Ansicht
Themen-Optionen

PNG und Canvas via BMP und anderes

Ein Thema von creehawk · begonnen am 9. Apr 2024 · letzter Beitrag vom 2. Mai 2024
Antwort Antwort
Seite 2 von 2     12   
creehawk

Registriert seit: 1. Jul 2013
Ort: Hamburg
243 Beiträge
 
Delphi 10.4 Sydney
 
#1

AW: PNG und Canvas via BMP und anderes

  Alt 10. Apr 2024, 16:06
Moin Moin.

Ich komme der Sache näher. Habe im Netz eine dicke WIC Beschreibung gefunden (WindowsImagingComponent), und experimentiere da mal mit rum.

Sollte ich das hinkriegen sage ich Bescheid. Denn BMP mit Transparenz ist - so scheint es - ein vielgefragtes Problem.

creehawk
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.892 Beiträge
 
Delphi 12 Athens
 
#2

AW: PNG und Canvas via BMP und anderes

  Alt 10. Apr 2024, 22:07
Ich komme der Sache näher. Habe im Netz eine dicke WIC Beschreibung gefunden (WindowsImagingComponent), und experimentiere da mal mit rum.

Sollte ich das hinkriegen sage ich Bescheid. Denn BMP mit Transparenz ist - so scheint es - ein vielgefragtes Problem.
Auf das es sehr einfache Antworten gibt. Ich habe bereits geschrieben, dass es passende FMX Funktionalität gibt. Und WIC gibt es auch bereits in Delphi als TWICImage.

Natürlich ist das Thema sicherlich spannend und es spricht nichts dagegen, selbst das Rad neu zu erfinden, aber wenn du einfach eine Lösung suchst, ist das unnötig.

Da du es selbst offenbar nicht angeschaut hast, liegt im Anhang ein Beispiel für ein VCL Projekt, das einen Teil eines PNG Bildes in ein neues PNG kopiert und speichert. Danach werden beide transparent in einem TImage angezeigt.
Angehängte Dateien
Dateityp: zip VCL mit FMX Bitmap.zip (6,8 KB, 12x aufgerufen)
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
creehawk

Registriert seit: 1. Jul 2013
Ort: Hamburg
243 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: PNG und Canvas via BMP und anderes

  Alt 11. Apr 2024, 09:45
Moin Moin.

@jaenicke
Erstmal vielen Dank für dein Beispiel.
Da Rad neu erfinden will ich eigentlich nicht. Aber verstehen was da wie abgeht.

Erstmal muss ich lernen was denn eigentlich die Elemente einer Grafik sind, die Formate und deren Bestandteile. PNG, DDS, JPG, BMP.

Das dauert eine Weile. Und wenn ich hier im Forum was frage gibt's ja immer Antworten, aus denen ich Denkanstösse oder Hinweise "sauge".

Was ich wollte habe ich ja hoffentlich soweit verständlich gesagt ganz am Anfang. Dachte ich. Jedenfalls hat mein erstes "Studium" der Zusammenhänge ergeben, das ein optisch perfektes PNG mit transparenten Hintergrund oft nicht so richtig transparent ist, da sind mitunter noch weitere Layerangaben versteckt, die bloss nicht angezeigt werden. Aber sobald man daraus dann ein BMP mit transparentem Hintergrund machen will kommen die Sachen zum Vorschein. Siehe die erste Post.

Wie auch immer, ich befasse mich jetzt ja mal mit den Möglichkeiten der TWicImage, denn da kann ich auch die in vielen Spielen vorkommenden DDS verarzten.

Aber nochmal Danke an alle die geantwortet haben.

creehawk
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.892 Beiträge
 
Delphi 12 Athens
 
#4

AW: PNG und Canvas via BMP und anderes

  Alt 11. Apr 2024, 13:08
Was ich wollte habe ich ja hoffentlich soweit verständlich gesagt ganz am Anfang. Dachte ich.
Einen Bereich aus einer PNG kopieren und speichern. Genau das macht mein Beispiel und zwar nicht als Bitmap sondern wieder als PNG mit Transparenz.

Jedenfalls hat mein erstes "Studium" der Zusammenhänge ergeben, das ein optisch perfektes PNG mit transparenten Hintergrund oft nicht so richtig transparent ist, da sind mitunter noch weitere Layerangaben versteckt, die bloss nicht angezeigt werden.
Das nennt sich Alphakanal. Der legt fest, "wie transparent" ein bestimmter Bereich ist. Du kannst also auch einen Bereich der PNG fast komplett transparent machen, einen anderen aber gar nicht transparent.

Bitmaps kennen auch einen Alphakanal, aber in der VCL ist der nicht implementiert. Dort wird eine transparente Farbe verwendet, so dass Halbtransparenzen usw. nicht möglich sind.

Deshalb habe ich ja auch vorgeschlagen, dass du, wie in meinem Beispiel, die FMX-Units dafür verwendest. Dann brauchst du keine zusätzlichen Bibliotheken, kannst also mit Bordmitteln gut damit arbeiten. Anzeigen kannst du in der VCL auch PNGs gut. Nur müssen es dafür halt weiter PNGs sein und keine konvertierten Bitmaps.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Jens01

Registriert seit: 14. Apr 2009
673 Beiträge
 
#5

AW: PNG und Canvas via BMP und anderes

  Alt 11. Apr 2024, 14:47
@creehawk
Hast Du mal Graphics32 oder TImage32 ausprobiert.
Die müßten eigentlich das können, was hier diskutiert wird. Bei Gaphics32 braucht man noch irgendeinen Konverter für PNGs.
Aber beide haben ein "TImage", das einen Teil Deiner Arbeit machen sollte.
Achtung: Bin kein Informatiker sondern komme vom Bau.
  Mit Zitat antworten Zitat
Redeemer

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
1.114 Beiträge
 
Delphi 2009 Professional
 
#6

AW: PNG und Canvas via BMP und anderes

  Alt 13. Apr 2024, 18:03
Canvas geht meines Wissens ja nur mit Bitmap.
Da ist dein Wissen falsch. Canvas geht mit TMetafileCanvas (ziemlich spezielles Ding) und insbesondere auch TPngImage.
Daher ist in tomkupitz' Lösung auch das Schreiben von Scanline unnötig - CopyRect tut's auch. Alpha muss aber meines Wissens immer noch per Scanline.
Janni
2005 PE, 2009 PA, XE2 PA
  Mit Zitat antworten Zitat
Michael II

Registriert seit: 1. Dez 2012
Ort: CH BE Eriswil
771 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: PNG und Canvas via BMP und anderes

  Alt 15. Apr 2024, 09:34
Delphi-Quellcode:
procedure PngToBmp32( p : TPngImage; b : TBitMap );
begin
   b.PixelFormat := pf32Bit;
   b.AlphaFormat := afDefined;
   b.Assign(p);
end;
...ist etwas einfacher und du hast dadurch auch eine ARGB Bitmap.
Probleme gibt's halt bei 32 Bit in VCL (wie bereits früher hier beschrieben) bei der Bearbeitung der Bitmap via VCL Grafikmethoden wie copyrect, rectangle etc., weil Delphi VCL in diesem Bereich im letzten Jahrtausend stehen geblieben ist.

Wenn du zum Beispiel eine ARGB Bitmap via VCL canvas.savetofile() speicherst, dann ruft Delphi TBitmap.WriteStream für (FImage.FDIB.dsBMIh.biBitCount = 32) and (FAlphaFormat = afDefined) die Prozedur UnPreMultiplyAlpha auf. U.a. wegen solchem Code (Aufrufe von UnPreMultiplyAlpha oder PreMultiplyAlpha zu Unzeiten) entstehen die falschen Farben, welche in #1 beschrieben werden.

Deshalb:
Bei einfacheren Problemen (wie copyrect Funktionalität für ARGB BitMap) kann man via BitBlt, AlphaBlend, TransparentBlt viel tun.
(graphics32 und FMX sind unnötig für einfache Kopierfunktionen von rechteckigen ARGB Bereichen.)

Wenn du komplexere Dinge anzeigen willst (zum Beispiel Bewegung, Alphakanal Malfarbe), dann würde ich dafür Windows Graphics32 verwenden (extrem performant) und wenn's nicht nur Windows sein muss FMX (Beispiel siehe #12). Ich weiss nicht wie gut FMX heute ist. In den Anfängen waren viele Dinge sehr umständlich programmiert. Aber heutige Prozessoren fressen solche Probleme ja durch Power und mit Energieverschwendung weg.

Wenn du deine App in Massen via Web verteilst ist bei der Wahl graphics32, FMX etc. eventuell auch die Grösse der .exe ein Faktor.

WICImage wurde hier erwähnt. Ich sehe nicht, wie dies beim Bearbeiten von ARGB Bildern helfen kann. Fürs Laden und Speichern ist es aber echt cool.
Weiss hier jemand wie man mit Delphis VCL TWICImage eine ARGB Bitmap als .BMP speichern kann (Bitmap als .PNG speichern funktioniert problemlos und ist sicher in den allermeisten Fällen eh sinnvoller)? Damit der korrekte ARGB BMP Header geschrieben wird müsste man für .BMP via IWICBitmapFrameEncode, IPropertyBag2 EnableV5Header32bppBGRA=1 setzen - wenn jemand Code hat, dann gern .
(Mich interessiert hier nur TWICImage; dass es durch direktes Schreiben des BMP Headers gut geht, weiss ich.)
Michael Gasser

Geändert von Michael II (15. Apr 2024 um 09:54 Uhr)
  Mit Zitat antworten Zitat
Michael II

Registriert seit: 1. Dez 2012
Ort: CH BE Eriswil
771 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: PNG und Canvas via BMP und anderes

  Alt 15. Apr 2024, 12:39
Hallo creehawk,

hier noch ein Beispiel, wie du mit TWICImage eine png Datei laden und als png, bmp, gif, tiff, jpeg abspeichern kannst. Weiter: ...wie du eine .png Datei in eine Bitmap laden kannst ...wie du bei gegebenem .png File einen Teil rauskopieren (dein Problem) und den kopierten Teil als .png abspeichern kannst. ...wie du eine ARGB Bitmap inklusive Transparenz abspeichern kannst.
Angehängte Dateien
Dateityp: zip Bitmap32.zip (188,3 KB, 12x aufgerufen)
Michael Gasser
  Mit Zitat antworten Zitat
Redeemer

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
1.114 Beiträge
 
Delphi 2009 Professional
 
#9

AW: PNG und Canvas via BMP und anderes

  Alt 18. Apr 2024, 19:32
WICImage wurde hier erwähnt. Ich sehe nicht, wie dies beim Bearbeiten von ARGB Bildern helfen kann. Fürs Laden und Speichern ist es aber echt cool.
Weiss hier jemand wie man mit Delphis VCL TWICImage eine ARGB Bitmap als .BMP speichern kann (Bitmap als .PNG speichern funktioniert problemlos und ist sicher in den allermeisten Fällen eh sinnvoller)? Damit der korrekte ARGB BMP Header geschrieben wird müsste man für .BMP via IWICBitmapFrameEncode, IPropertyBag2 EnableV5Header32bppBGRA=1 setzen - wenn jemand Code hat, dann gern .
(Mich interessiert hier nur TWICImage; dass es durch direktes Schreiben des BMP Headers gut geht, weiss ich.)
Also ich krieg TWICImage nicht dazu, BGRA-Bitmaps zu laden. Also laden schon, nur ohne Alpha. Egal ob per Bitfields oder implizit. Ich nutze daher PNG.
Janni
2005 PE, 2009 PA, XE2 PA
  Mit Zitat antworten Zitat
Michael II

Registriert seit: 1. Dez 2012
Ort: CH BE Eriswil
771 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: PNG und Canvas via BMP und anderes

  Alt 27. Apr 2024, 22:01
Also ich krieg TWICImage nicht dazu, BGRA-Bitmaps zu laden. Also laden schon, nur ohne Alpha. Egal ob per Bitfields oder implizit. Ich nutze daher PNG.
In den meisten Fällen wird man wohl eh als PNG speichern und von PNG laden wollen (File kleiner und Decodieren/Encodieren heute extrem schnell).

Ich kann aber mit WICImage (ohne irgendwas anzupassen) in Delphi 11.2 problemlos ARGB Bitmaps laden. Alphakanal ist mit dabei. Welche Delphi Version verwendest du?
Leider fügt Delphi beim Speichern von ARGBs mit TWICImage nicht automatisch den boolean Variant EnableV5Header32bppBGRA=1/TRUE hinzu und speichert deshalb nur RGB. Deshalb noch einmal meine Frage: Weiss jemand wie man gewünschte Eigenschaften in den Bag einpackt?

Beim Speichern von ARGB Bitmaps schreibt man TBitmapFileHeader, TBitmapV5Header, Bilddaten selbst und gut ist.
Michael Gasser
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:48 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 by Thomas Breitkreuz