AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Png im TImage: Konversion von D2006 auf D2009 schlägt fehl
Thema durchsuchen
Ansicht
Themen-Optionen

Png im TImage: Konversion von D2006 auf D2009 schlägt fehl

Ein Thema von Assertor · begonnen am 8. Nov 2008 · letzter Beitrag vom 10. Nov 2008
Antwort Antwort
Assertor

Registriert seit: 4. Feb 2006
Ort: Hamburg
1.296 Beiträge
 
Turbo C++
 
#1

Png im TImage: Konversion von D2006 auf D2009 schlägt fehl

  Alt 8. Nov 2008, 19:46
Hi DPler,

mal ein interessantes Problem: Ich lade ein Projekt von D2006 in D2009 und verliere alle TImage Bilder - sprich diese sind wieder leer. Bei den Bildern handelt es sich um PNGs.

Nun habe ich mir mal die DFM vor und nach dem Konvertieren angesehen:

In D2006 fängt Picture.Data so an:
0A54504E474F626A656374, danach dann das PNG 89504E470D0A1A0A0000000D49484452000000200000...

Wenn ich jetzt das Bild manuell in TImage unter Delphi 2009 lade,
fängt Picture.Data so an:
0954506E67496D616765, danach geht es 100% identisch zu D2006 weiter.

Warum es danach identisch ist, ist klar: Es folgen die Hex-Binärdaten des PNG. Das muß ja identisch sein.

Ich gehe jetzt davon aus, daß CG hier etwas am TImage gedreht hat, was dazu führt, daß meine Images nicht mehr geladen werden können.

Warum weicht der TImage.Picture.Data Header hier ab?

Ist dies jemandem anderes schon aufgefallen? Insbesondere wenn Ihr auch zuvor schon PngImage genutzt habt?

Gruß Assertor
Frederik
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#2

Re: Png im TImage: Konversion von D2006 auf D2009 schlägt fe

  Alt 8. Nov 2008, 20:02
Zitat von Assertor:
In D2006 fängt Picture.Data so an:
0A54504E474F626A656374, danach dann das PNG 89504E470D0A1A0A0000000D49484452000000200000...

Wenn ich jetzt das Bild manuell in TImage unter Delphi 2009 lade,
fängt Picture.Data so an:
0954506E67496D616765, danach geht es 100% identisch zu D2006 weiter.
0A54504E474F626A656374 bedeutet als Text 'TPNGObject' - 0A steht für die Länge in Zeichen
0954506E67496D616765 bedeuted 'TPngImage'

Also hat Borland den Classennamen intern geändert und nicht bedacht, dass dies deinen beschriebenen Nebeneffekt hat.
  Mit Zitat antworten Zitat
Assertor

Registriert seit: 4. Feb 2006
Ort: Hamburg
1.296 Beiträge
 
Turbo C++
 
#3

Re: Png im TImage: Konversion von D2006 auf D2009 schlägt fe

  Alt 8. Nov 2008, 20:26
Hi sx2008,

Zitat von sx2008:
0A54504E474F626A656374 bedeutet als Text 'TPNGObject' - 0A steht für die Länge in Zeichen
0954506E67496D616765 bedeuted 'TPngImage'

Also hat Borland den Classennamen intern geändert und nicht bedacht, dass dies deinen beschriebenen Nebeneffekt hat.
sx, Du bist super! Nach dem ganzen WinMerge Source-Compares von PngImage.pas 2006/2009 und der DFM Rohdaten bin ich garnicht mehr auf die Idee gekommen, mir das mal als ASCII anzusehen

Hmm, dann werd ich mal versuchen schnell einen Wrapper zu schreiben.

Gruß und Danke!
Assertor
Frederik
  Mit Zitat antworten Zitat
Assertor

Registriert seit: 4. Feb 2006
Ort: Hamburg
1.296 Beiträge
 
Turbo C++
 
#4

Re: Png im TImage: Konversion von D2006 auf D2009 schlägt fe

  Alt 9. Nov 2008, 12:16
Hi,

ich habe das gerade eben mal probiert mit einem "Wrapper" à la
Delphi-Quellcode:
type
  TPngObject = type TPngImage;

initialization
  TPicture.RegisterFileFormat('PNG', 'Portable Network Graphics (Compatibility Wrapper)', TPngObject);

finalization
  TPicture.UnregisterGraphicClass(TPngObject);
Das klappt aber leider nicht so einfach: Die Klasse wird korrekt registriet, denn es steht danach im D2009 TImage Picture-Dialog 2x PNG als Dateitype zur Auswahl und beim 2. auch der Text mit "Compatibility Wrapper".

Die vorhandenen PNGs in den TImages aus D2006 werden jedoch noch immer geleert.

Soweit ich es verstanden habe, fügt ja Delphi in den Binärdaten im DFM als Prefix den Klassennamen (und die Länge des Namens davor) ein. Hier sollte eigentlich bei korrekt registrierter TPngObject-Klasse ja auch das Laden klappen...

Hat noch jemand eine Idee?

Gruß Assertor
Frederik
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#5

Re: Png im TImage: Konversion von D2006 auf D2009 schlägt fe

  Alt 9. Nov 2008, 12:24
Zitat von Assertor:
TPngObject = type TPngImage;
Das klappt so nicht, denn die "ClassName" Method liefert hierbei immernoch den echten Klassennamen zurück, der steht dann halt nur in einer anderen identischen Kopie der RTTI für TPngImage.

Wenn du einen anderen Klassennamen willst, dann geht das nur so:
TPngObject = class(TPngImage);
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#6

Re: Png im TImage: Konversion von D2006 auf D2009 schlägt fe

  Alt 9. Nov 2008, 12:51
Schreib dir doch einfach ein Tool, das diese Zeichenfolge in deinen DFMs ersetzt.
  Mit Zitat antworten Zitat
Assertor

Registriert seit: 4. Feb 2006
Ort: Hamburg
1.296 Beiträge
 
Turbo C++
 
#7

Re: Png im TImage: Konversion von D2006 auf D2009 schlägt fe

  Alt 9. Nov 2008, 13:02
Hi,

Zitat von jbg:
Zitat von Assertor:
TPngObject = type TPngImage;
Das klappt so nicht, denn die "ClassName" Method liefert hierbei immernoch den echten Klassennamen zurück, der steht dann halt nur in einer anderen identischen Kopie der RTTI für TPngImage.

Wenn du einen anderen Klassennamen willst, dann geht das nur so:
TPngObject = class(TPngImage);
Danke Andreas, die beiden hatte ich gerade verwechselt. Es geht! Und auch danke für Deinen Form Fix

Und für alle, die mal vor dem gleichen Problem stehen: Der Klassenname ist auch Case-Sensitiv, also TPngObject != TPNGObject für die DFM Daten

Ich hatte zuerst in D2009 nun
0A54506E674F626A656374
statt
0A54504E474F626A656374 raus.

Da hat Delphi natürlich recht

Leider hat CodeGear in der neuen PngImage.pas
Delphi-Quellcode:
type
  TPNGObject = TPngImage deprecated 'Use TPngImage.';
gesetzt.

Damit muß man entweder einen Wrapper nutzen, oder alle PNG-Daten in den DFMs manipulieren.

Gruß Assertor

@NamenLozer: Die Idee ist natürlich gut - hatte ich auch schon überlegt. Ich wollte nur dem Problem gerne auf den Grund gehen und auch einen "Live-Fix" haben. An sich müsste es ja auch mehr Delphi Programmierer geben, die in Forms schon früher PNGs hatten
Frederik
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.089 Beiträge
 
Delphi 12 Athens
 
#8

Re: Png im TImage: Konversion von D2006 auf D2009 schlägt fe

  Alt 10. Nov 2008, 18:26
Folgende Zeilen an geeigneter Stelle führen zum Erfolg:

Delphi-Quellcode:
type
  TPNGObject = class(TPngImage);

begin
  TPicture.RegisterFileFormat('', '', TPNGObject);
end.
Die Neudeklaration von TPNGObject ist notwendung, um die deprecated Declaration von CodeGear zu überschreiben, ansonsten wird TPNGObject nicht erkannt (danke Andreas!). Die beiden Leerstrings (eigentlich nur der erste) verhindern eine Doppelauflistung der Extension im Filterstring.

Auf Anregung von Assertor habe ich mir erlaubt, den Fix in die PngComponents für Delphi 2009 aufzunehmen.
Uwe Raabe
  Mit Zitat antworten Zitat
Antwort Antwort


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 03:27 Uhr.
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