AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

PNG in TImage falsch dargestellt

Ein Thema von tumo · begonnen am 14. Apr 2020 · letzter Beitrag vom 29. Apr 2020
Antwort Antwort
Seite 3 von 6     123 45     Letzte » 
Rolf Frei

Registriert seit: 19. Jun 2006
387 Beiträge
 
Delphi 10.3 Rio
 
#21

AW: PNG in TImage falsch dargestellt

  Alt 20. Apr 2020, 18:04
Ich stehe da im Moment etwas auf Kriegsfuss mit der Embarcadero Website, da ich da aktuell nicht mehr den Überblick habe, was da nun aktuell ist und was nicht. Wo muss ich das genau machen, damit ich nicht irgendwo was erfasse, das garnicht mehr genutzt wird? Für mich wirkt das alles aktuell wie eine grosse Baustelle, wo man nicht mehr recht weiss, was wo zu machen ist.

Ist da qualitiy.embarcadero.com noch der richtige Platz dafür?
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
1.654 Beiträge
 
Delphi 10.3 Rio
 
#22

AW: PNG in TImage falsch dargestellt

  Alt 20. Apr 2020, 20:30
Ich stehe da im Moment etwas auf Kriegsfuss mit der Embarcadero Website, da ich da aktuell nicht mehr den Überblick habe, was da nun aktuell ist und was nicht. Wo muss ich das genau machen, damit ich nicht irgendwo was erfasse, das garnicht mehr genutzt wird? Für mich wirkt das alles aktuell wie eine grosse Baustelle, wo man nicht mehr recht weiss, was wo zu machen ist.

Ist da qualitiy.embarcadero.com noch der richtige Platz dafür?
Ja, https://quality.embarcadero.com ist noch der richtige Platz dafür!
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
8.676 Beiträge
 
Delphi 10.4 Sydney
 
#23

AW: PNG in TImage falsch dargestellt

  Alt 21. Apr 2020, 00:40
(Ich weiß, dass der Code Memoryleaks hat.)
Hast du vergessen zu speichern? Der Code ist faktisch nicht existent:
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm1 = class(TForm)
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

end.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von scrat1979
scrat1979

Registriert seit: 12. Jan 2007
Ort: Sulzbach a.d. Murr
1.019 Beiträge
 
Delphi 10.4 Sydney
 
#24

AW: PNG in TImage falsch dargestellt

  Alt 21. Apr 2020, 16:06
Ich klinke mich mal kurz ein da ich gerade auch einen Code erstellt habe um aus einen Stream (genauer gesagt ein im Stream gespeichertes PNG) in einem TImage anzuzeigen. Das (transparente) PNG wird über LoadFromStream in ein TPNGImage geladen und anschließend in einem TImage angezeigt. Sofern ich nicht völlig blind bin klappt die Darstellung der Transparenzen problemlos... Delphi 10.3.3
Michael Kübler
  Mit Zitat antworten Zitat
tumo

Registriert seit: 28. Apr 2014
46 Beiträge
 
Delphi 10.3 Rio
 
#25

AW: PNG in TImage falsch dargestellt

  Alt 21. Apr 2020, 16:14
Nach weiterem überlegen, probieren und googlen habe ich "herausgefunden", dass der Anzeigefehler nur auftritt, wenn die PNG im ColorMode 3 (Paletten-Modus) geladen wird. @Redeemer hatte also den richtigen Riecher (oder womöglich schon eine Lösung?). Warum genau dadurch Ränder schwarz angezeigt werden, wo die Pixeldaten eig. richtig sind, bleibt mir aber ein Rätsel. Mit der Graphics32 Library habe ich jetzt ein wenig rumprobiert. Sie geht, aber recht umständlich in manchen Belangen. Die essentielle Funktion für mich (PNGs laden) geht nur mit einer extra Unit, die man noch dazu installieren muss :/. Sollte es also eine Lösung für die VCL TImages geben, wäre ich sehr erfreut, diese zu erfahren.

@scrat1979
Wie gesagt, es ist nur bei manchen PNGs. Um genau zu sein bei PNGs im ColorMode 3 (Paletten-Modus)
  Mit Zitat antworten Zitat
Benutzerbild von scrat1979
scrat1979

Registriert seit: 12. Jan 2007
Ort: Sulzbach a.d. Murr
1.019 Beiträge
 
Delphi 10.4 Sydney
 
#26

AW: PNG in TImage falsch dargestellt

  Alt 21. Apr 2020, 19:52
@Tumo: Alles klar, könnte die Erklärung sein, dass es bei mir - Gott sei dank - funktioniert. Wollte es auch nur der Vollständigkeit halber erwähnen.

Viel Erfolg dir weiterhin
Michael Kübler
  Mit Zitat antworten Zitat
Rolf Frei

Registriert seit: 19. Jun 2006
387 Beiträge
 
Delphi 10.3 Rio
 
#27

AW: PNG in TImage falsch dargestellt

  Alt 22. Apr 2020, 12:57
Ich klinke mich mal kurz ein da ich gerade auch einen Code erstellt habe um aus einen Stream (genauer gesagt ein im Stream gespeichertes PNG) in einem TImage anzuzeigen. Das (transparente) PNG wird über LoadFromStream in ein TPNGImage geladen und anschließend in einem TImage angezeigt. Sofern ich nicht völlig blind bin klappt die Darstellung der Transparenzen problemlos... Delphi 10.3.3
Mein beschriebenes Problem ist etwas tiefgründiger, wie ich festgestellt habe. Wenn du das PNG einfach nur darstellst, passt das. Sobald du nun aber eine Bitmap daraus machst, also mit Assign, und es speicherst wird der Hintergrund nun schwarz und der Alphachannelbereich wird falsch und sieht fürchterlcih aus. Das ist mit der älteren PNGImages aus D7 nicht der Fall. Da ist der Hintergrund nach dem Speichern weiss und auch der Alphachannel wird richtig gespeichert. Die RIO PNGImages Klasse macht das falsch und durch das Schwarz setzten des Hintergrunds wird beim speichern das Bitmap "kaputt" gemacht. Das heisst, die altbekannte Transparenz beim Bitmap wird gesetzt (Farbe Schwarz) und der Alphachannelbereich der Grafik wird nicht transparent. Mit der alten Version wird keine Transparenz gespeichert und daher sieht das da auch richtig aus. Ich erwarte hier auch garnicht, dass das Bitmap eine Trnasparenz bekommt, da TBitmap das Bild nicht mit dem Alphachannel speichert. Die neue Version versucht das Bitmap transparent zu machen, das geht aber nur solange kein Alphachannel im Spiel ist, ansonsten sieht das Bitmap fürchterlich aus.

Siehe die anghängten Bilder und das beigefügte Demoprojekt.
- transAlpha.png Originaldatei
- transAlphaRio.bmp Speicherung der Bitmap nach dem Assign mit der aktuellen VCL.Imaging.PNGImages.pas
- transAlphaD7.bmp Speicherung der Bitmap nach dem Assign mit der alten D7 PNGImges.pas

Wer die D7 Version der PNGImages nicht hat, kann einfach die beiden von mir oben erwöhnten Zeilen in der aktuellen Version löschen und schon ist alles wieder wie es sein soll.
Angehängte Dateien
Dateityp: zip PNG-BMP-Images.zip (851,3 KB, 2x aufgerufen)

Geändert von Rolf Frei (22. Apr 2020 um 13:17 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von scrat1979
scrat1979

Registriert seit: 12. Jan 2007
Ort: Sulzbach a.d. Murr
1.019 Beiträge
 
Delphi 10.4 Sydney
 
#28

AW: PNG in TImage falsch dargestellt

  Alt 22. Apr 2020, 13:12
Okay, alles klar. Ich gehe auch den Umweg über ein TBitmap, da letztendlich eine Darstellung in einer TImageList erfolgen soll (genauer gesagt Replace, das erfordert eben ein TBitmap). Funktioniert tadellos. Allerdings - wie du schon richtig erkannt hast - geht es um die reine Darstellung.
Michael Kübler
  Mit Zitat antworten Zitat
Redeemer

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

AW: PNG in TImage falsch dargestellt

  Alt 22. Apr 2020, 19:13
Hast du vergessen zu speichern?[/DELPHI]
Ups. Ist angehängt.

Okay, alles klar. Ich gehe auch den Umweg über ein TBitmap, da letztendlich eine Darstellung in einer TImageList erfolgen soll (genauer gesagt Replace, das erfordert eben ein TBitmap).
Dann haben sie das wohl inzwischen repariert, dass Replace mit Transparenz klarkommt so wie es Add und Insert schon vorher konnten.
Angehängte Dateien
Dateityp: 7z TransTest.7z (240,0 KB, 4x aufgerufen)
Janni
2005 PE, 2009 PA, XE2 PA
  Mit Zitat antworten Zitat
tumo

Registriert seit: 28. Apr 2014
46 Beiträge
 
Delphi 10.3 Rio
 
#30

AW: PNG in TImage falsch dargestellt

  Alt 22. Apr 2020, 19:16
Okay, ich habe noch ein wenig weiter probiert:

Beim Auslesen der Header-Daten ist mir aufgefallen, dass ich folgende PNGs im Testset habe:
PNG 1: RGBA (Mode 6) ; 8bit/ch -> 32bit/px ; Transparenz-Modus: Partial (Nur Binärer Alpha-Channel)
PNG 2: RGB (Mode 2) ; 8bit/ch -> 24bit/px ; Transparenz-Modus: None
PNG 3: Palette (Mode 3) ; 8bit/ch -> 8bit/px ; Transparenz-Modus: None
PNG 4: Palette (Mode 3) ; 8bit/ch -> 8bit/px ; Transparenz-Modus: Bit
PNG 5: Palette (Mode 3) ; 4bit/ch -> 4bit/px ; Transparenz-Modus: None

Zur Darstellung habe ich einige Codeschnipsel gebastelt:
Code 1:
Delphi-Quellcode:

Image.Picture.LoadFromStream(AStream);
Code 2:
Delphi-Quellcode:
png := TPNGImage.Create;
png.LoadFromStream(AStream);
Image.Picture.Graphic := png;
Code 3:
Delphi-Quellcode:
png := TPNGImage.Create;
png.LoadFromStream(AStream);
bmp := TBitmap.Create;
bmp.Assign(png);
Image.Picture.Graphic := bmp;
Code 4:
Delphi-Quellcode:
png := TPNGImage.Create;
png.LoadFromStream(AStream);
bmp := TBitmap.Create;
bmp.Assign(png);
Image.Picture.Graphic := bmp;
Image.Transparent := png.TransparencyMode = ptmBit
Daraus habe ich diese Tabelle kreiert:
 Code 1 Code 2 Code 3 Code 4
PNG 1 Ok Ok Ok Ok
PNG 2 Ok Ok Ok Ok
PNG 3 Ok Ok Ok Ok
PNG 4 Schwarze Outlines (Siehe OP) Schwarze Outlines (Siehe OP) Tranzparenz wird schwarz dargestellt Ok, Leichter Bildversatz im Vergleich zu PNG<>4
PNG 5 Ok Ok Ok Ok

Es wird deutlich, dass die pngimage Library von Delphi Probleme mit dem Darstellen von BitAlpha PNGs hat. Wie bereits gesagt, die Pixeldaten selbst geben beim Zugriff über png.Pixels aber auch bmp.Pixels die korrekten Farbdaten an. Deswegen ist meine Vermutung, dass im TPNGImage.Draw ein Fehler passiert, vllt in Kombination mit dem Stretch? pngimage hat einen extra AlphaBit-Case in seiner Draw-Funktion. Da hier aber hauptsächlich mit Windows-Funktionen hantiert wird, kann ich ab diesem Punkt nicht wirklich weiter ermitteln, besonders, da ich mir nicht sicher sein kann, dass dort tatsächlich der Fehler liegt.
Ich wollte mal erfahren, ob Ihr den Fehler reproduzieren könnt?
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 +2. Es ist jetzt 13:07 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf