Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   AnimatePNG (https://www.delphipraxis.net/192106-animatepng.html)

Delphi-Laie 27. Mär 2017 20:51

AW: AnimatePNG
 
Na schön, Speicher ist natürlich ein Argument. Auf der anderen Seite ist die (absolute) Einsparung von Speicherplatz bzw. Dateigröße umso größer, je größer die Gif ist, die zu Apng konvertiert wird, das spricht wiederum dafür, daß möglichst große Dateien konvertiert werden können.

Schade, wenn Du nicht weitermachst, aber es ist Deine Entscheidung. Das Interesse an diesem Deinem Programm wüchse sicherlich, wenn Dein Programm noch mehr könnte, es ist ja nur ein Zwischenstand. Insofern sollte man nicht zu schnell die Flinte in's Korn werfen.

EWeiss 27. Mär 2017 21:00

AW: AnimatePNG
 
Zitat:

Zitat von Delphi-Laie (Beitrag 1365681)
Na schön, Speicher ist natürlich ein Argument. Auf der anderen Seite ist die (absolute) Einsparung von Speicherplatz bzw. Dateigröße umso größer, je größer die Gif ist, die zu Apng konvertiert wird, das spricht wiederum dafür, daß möglichst große Dateien konvertiert werden können.

Schade, wenn Du nicht weitermachst, aber es ist Deine Entscheidung. Das Interesse an diesem Deinem Programm wüchse sicherlich, wenn Dein Programm noch mehr könnte, es ist ja nur ein Zwischenstand. Insofern sollte man nicht zu schnell die Flinte in's Korn werfen.

Ich werde den Konverter mal umbauen so das man eine Datei auswählen kann.
Dann kann ich besser analysieren warum ausgerechnet deine Datei nicht so recht will.

AnimatePNG werde ich im Moment mal auf seite lassen da ich noch keine Lösung für die CPU Auslastung gefunden habe.
Eventuell wird es besser wenn ich "Cached Bitmap" verwende soll die Performance steigern. (Aber später)

Melde mich wenn das Teil getestet werden kann.

EDIT:
Deine Datei im original Format 200x200 wo ich alle Frames extrahiert und in eine PSD importiert habe ist mal locker 41,2 MB groß.
Nur zur Info. Bei doppelter größe kommst du leicht an die 100MB
Ob ich das am ende alles so in den Speicher schaufeln kann muss ich erst mal sehn.

gruss

Delphi-Laie 27. Mär 2017 21:54

AW: AnimatePNG
 
Zitat:

Zitat von EWeiss (Beitrag 1365682)
EDIT:
Deine Datei im original Format 200x200 wo ich alle Frames extrahiert und in eine PSD importiert habe ist mal locker 41,2 MB groß.
Nur zur Info. Bei doppelter größe kommst du leicht an die 100MB
Ob ich das am ende alles so in den Speicher schaufeln kann muss ich erst mal sehn.

Also, ich wollte Dich mit den beiden Gifs nicht ärgern und Deinem Programm mit einem Härtetest auf den Zahn fühlen. Diese Gifs stöberte ich irgendwo im Internet auf, und weil sie thematisch gut zu einem meiner Kapitel paßten, bediente ich mich.

Als ich dann hier las, daß man auch PNG eine Animation verpassen kann, dachte ich sofort an diese beiden Delinquenten und fing Feuer und Flamme. Ernüchtert war ich jedoch, als ich las, daß derzeit nur Firefox dieses Animationsformat unterstützt. Vermutlich werden andere Browser nachziehen, jedoch bin ich eher ein Freund möglichst großer Abwärtskompatibiltät.

Im Original sind diese beiden Gif-Prachtexemplare ja "nur" ca. 1,7 MByte groß. Was daraus so alles werden kann....

EWeiss 27. Mär 2017 21:57

AW: AnimatePNG
 
Zitat:

Also, ich wollte Dich mit den beiden Gifs nicht ärgern und Deinem Programm mit einem Härtetest auf den Zahn fühlen. Diese Gifs stöberte ich irgendwo im Internet auf, und weil sie thematisch gut zu einem meiner Kapitel paßten, bediente ich mich.
Tust du nicht mich interessiert es selbst warum das jetzt so ist.
Ich muss dazu aber die normale nicht die von mir angepasste GDI+ verwenden dazu muss ich eine VCL Anwendung erstellen.

gruss

jaenicke 27. Mär 2017 22:08

AW: AnimatePNG
 
Ist in dem Quelltext oben die aktuelle Version mit dem Problem mit der CPU Last drin? Optimierungen haben mich schon immer gereizt... ;-)
Bin grad am Handy, könnte aber morgen mal schauen.

Luckie 27. Mär 2017 22:15

AW: AnimatePNG
 
Was stört denn die CPU Auslastung? Dazu ist die CPU doch da, um benutzt zu werden. Und so lange du die Prozesspriorität nicht auf High oder höher setzt, wird dein Prozess auch CPU Zeit abgeben, wenn ein anderer Prozess sie benötigt.

EWeiss 27. Mär 2017 22:16

AW: AnimatePNG
 
Zitat:

Zitat von jaenicke (Beitrag 1365685)
Ist in dem Quelltext oben die aktuelle Version mit dem Problem mit der CPU Last drin? Optimierungen haben mich schon immer gereizt... ;-)
Bin grad am Handy, könnte aber morgen mal schauen.

Leider nein nur in der Bin Datei befindet sich die aktuelle Version ohne Quelltext.
Entschuldige.

gruss

Delphi-Laie 27. Mär 2017 22:49

AW: AnimatePNG
 
Emil, das Angebot Sebastians schlägst Du aus? Das ist ja immerhin wie ein Vierer im Lotto!

Zitat:

Zitat von Luckie (Beitrag 1365687)
Was stört denn die CPU Auslastung? Dazu ist die CPU doch da, um benutzt zu werden.

Na, wir wollen doch alle die Ressourcen möglichst schonen und unnötige Rechnerei vermeiden. Vielleicht ist da ja etwas redundantes.

Zitat:

Zitat von Luckie (Beitrag 1365687)
Und so lange du die Prozesspriorität nicht auf High oder höher setzt,

Bei mehr als einem Prozessor(kern) kann man es bis zur Echtzeit-Priorität wagen, ansonsten wird es riskant.

Zitat:

Zitat von Luckie (Beitrag 1365687)
wird dein Prozess auch CPU Zeit abgeben, wenn ein anderer Prozess sie benötigt.

Abgeben? Wir sind doch längst im präemptiven Windows, in dem den Prozessen die Rechenzeit zugewiesen wird?!

EWeiss 27. Mär 2017 22:56

AW: AnimatePNG
 
Zitat:

Emil, das Angebot Sebastians schlägst Du aus? Das ist ja immerhin wie ein Vierer im Lotto!
Nein ich schlage es nicht aus.
Wenn er möchte kann er mir eine Mail schicken und ich sende ihn den Source zu.

Aber ich möchte ihn so wie er momentan ist hier nicht veröffentlichen da muss ich mich ja schämen.
Leider kommen ja keine Infos ob das Teil im Binär Archiv überhaupt funktioniert.


gruss

EWeiss 27. Mär 2017 23:00

AW: AnimatePNG
 
Zitat:

Na, wir wollen doch alle die Ressourcen möglichst schonen und unnötige Rechnerei vermeiden. Vielleicht ist da ja etwas redundantes.
Es hat ganz einfach damit zu tun das wenn zu viel rechen zeit benötigt wird bzw. die CPU Auslastung zu hoch ist die Frames in den Keller gehen.
Ich möchte das Teil zumindest versuchen fliesend abzuspielen.

Schon mal ein Spiele mit 13 Frames gespielt?
Wenn ja dann weist du was ich meine.

gruss

Luckie 27. Mär 2017 23:01

AW: AnimatePNG
 
Zitat:

Zitat von Delphi-Laie (Beitrag 1365691)
Abgeben? Wir sind doch längst im präemptiven Windows, in dem den Prozessen die Rechenzeit zugewiesen wird?!

Das meinte ich auch eigentlich.

EWeiss 28. Mär 2017 09:20

AW: AnimatePNG
 
So habe den Konverter fertig.
@Delphi-Laie

Was deine Datei angeht.
Da liegt kein Problem im Code selber vor, dein Problem ist das die Datei einfach zu groß ist also die menge an Frames.
Du hast 984 Frames diese mal 512 in der weite.
Das bedeutet deine Datei hätte dann eine gesamt weite im Speicher von 503808 Pixeln.
Das schafft die GDI+ nicht zu speichern warum auch immer.

Delphi-Quellcode:
function TfrmMain.SaveToPNG(FullName: PWideChar; img: GPImage): GPStatus;
var
  encoderCLSID: TGUID;
begin

  GetEncoderClsid('image/png', encoderCLSID);
  Result := GdipSaveImageToFile(img, FullName, @encoderCLSID, nil);
end;
Hier gibt es dann einen Win32Error.

gruss

jaenicke 28. Mär 2017 09:49

AW: AnimatePNG
 
Aber das ist ja nicht ein großes Bild, sondern 984 einzelne. Da sollte die Anzahl der Frames keine Rolle spielen.

Im Moment kann ich mir das allerdings nicht anschauen, erst zu Hause.

EWeiss 28. Mär 2017 09:57

AW: AnimatePNG
 
Zitat:

Zitat von jaenicke (Beitrag 1365733)
Aber das ist ja nicht ein großes Bild, sondern 984 einzelne. Da sollte die Anzahl der Frames keine Rolle spielen.

Im Moment kann ich mir das allerdings nicht anschauen, erst zu Hause.

Es wird auf die Größe von 512 Pixeln Transformiert.
Es gibt eine Möglichkeit die Bilder unskaliert umzuwandeln habe das aber im Moment einfach mal deaktiviert (nicht öffentlich gemacht)
weil in meiner Anwendung 512x512 am besten aussieht.

Zitat:

Da sollte die Anzahl der Frames keine Rolle spielen.
Auch wenn es nur ein Bild ist muss ich doch alle Bilder Hintereinander erst mal Temporär aufarbeiten.
Und die stehen im Speicher hintereinander.

Delphi-Quellcode:
      for K := 0 to FrameCount - 1 do
      begin
        GPStatus(GdipImageSelectActiveFrame(img, @pGUID, K));
        // Image zeichnen
        if (MaxSquareSize = 512) then
        begin
          GPStatus(GdipDrawImageRectRectI(Graphics, img, xStep + xP, yP, xS, yS, 0, 0, round(W),
              round(H), UnitPixel, nil, Abort, nil));
          xStep := xStep + AniHeader.Width;
        end
        else
        begin
          GPStatus(GdipDrawImageRectI(Graphics, img, xStep, 0, round(W), round(H)));
          xStep := xStep + round(W);
        end;

        lblValue.Caption := 'Value = ' + IntToStr(K + 1);
        lblValue.Repaint;
      end;
      // graphics freigeben
      GPStatus(GdipDeleteGraphics(Graphics));
    end;
Zurück wird dann 1 Image geliefert das alle Frames enthält.

Delphi-Quellcode:
    Result := BitmapToImage(imgHDC);


gruss

TiGü 28. Mär 2017 11:06

AW: AnimatePNG
 
Zitat:

Zitat von EWeiss (Beitrag 1365734)
Zurück wird dann 1 Image geliefert das alle Frames enthält.

Delphi-Quellcode:
    Result := BitmapToImage(imgHDC);

Bist du dir sicher, dass sowas der richtige Ansatz ist? :shock:

Um es ein die analoge Welt zu übersetzen:
Du packst das Blätter-Paket mit den Bildern aus und klebst alle Bilder hintereinander auf eine lange Papierrolle und versuchst diese abzuspielen.
Das diese Rolle dann zu lang wird, um sie ohne "knittern" und "einreißen" bedienen zu können sollte eigentlich auf der Hand liegen.
Versuche doch mal lieber den Ansatz, einfach die linke obere Ecke zu tackern und das Blätter-Paket wie ein Daumenkino zu bedienen.

Da es dir schwer fällt von solchen abstrakten Sachen zu konkreten Code zu kommen:
Immer nur das jeweils aktuelle Frame decodieren und anzeigen, nach dem Anzeigen dann verwerfen.
Und nicht so schnell wie möglich zeichnen, sondern einfach nur stumpf die eingestellte Framerate.
Stelle mal bewusst das Ausführen der Zeichnenroutine auf 25 FPS bzw. alle 40 ms.

EWeiss 28. Mär 2017 11:09

AW: AnimatePNG
 
Zitat:

Zitat von TiGü (Beitrag 1365744)
Zitat:

Zitat von EWeiss (Beitrag 1365734)
Zurück wird dann 1 Image geliefert das alle Frames enthält.

Delphi-Quellcode:
    Result := BitmapToImage(imgHDC);

Bist du dir sicher, dass sowas der richtige Ansatz ist? :shock:

Um es ein die analoge Welt zu übersetzen:
Du packst das Blätter-Paket mit den Bildern aus und klebst alle Bilder hintereinander auf eine lange Papierrolle und versuchst diese abzuspielen.
Das diese Rolle dann zu lang wird, um sie ohne "knittern" und "einreißen" bedienen zu können sollte eigentlich auf der Hand liegen.
Versuche doch mal lieber den Ansatz, einfach die linke obere Ecke zu tackern und das Blätter-Paket wie ein Daumenkino zu bedienen.

Da es dir schwer fällt von solchen abstrakten Sachen zu konkreten Code zu kommen:
Immer nur das jeweils aktuelle Frame decodieren und anzeigen, nach dem Anzeigen dann verwerfen.
Und nicht so schnell wie möglich zeichnen, sondern einfach nur stumpf die eingestellte Framerate.
Stelle mal bewusst das Ausführen der Zeichnenroutine auf 25 FPS bzw. alle 40 ms.

Es zeigt das du keine Ahnung von der Aufarbeitung einer APNG Datei hast.
Beschäftige dich doch erst mal damit bevor du irgendwelche Sprüche los lässt die kein Hand und kein Fuß haben.
Da fällt mir ehrlich gesagt auch einiges schwer.

Zitat:

Bist du dir sicher, dass sowas der richtige Ansatz ist?
Du hast doch gar keine Ahnung für was diese Funktion gut ist.. und was in dieser enthalten ist..
Also ruhig Blut.

Also Konstruktive Dinge wären durchaus angebracht.

gruss

TiGü 28. Mär 2017 11:26

AW: AnimatePNG
 
Zitat:

Zitat von EWeiss (Beitrag 1365746)
Es zeigt das du keine Ahnung von der Aufarbeitung einer APNG Datei hast.
Beschäftige dich doch erst mal damit bevor du irgendwelche Sprüche los lässt die kein Hand und kein Fuß haben.

Hast du dich schonmal gefragt, warum du in vielen Threads den Alleinunterhalter gibst?
Der Ton macht die Musik!

Zitat:

Zitat von EWeiss (Beitrag 1365746)
Du hast doch gar keine Ahnung für was diese Funktion gut ist.. und was in dieser enthalten ist..
Also ruhig Blut.

Diese Funktion nimmt alle Frames aus einer APNG und schreibt die hintereinander in ein großes Bitmap:
Zitat:

Zitat von EWeiss (Beitrag 1365746)
Du hast 984 Frames diese mal 512 in der weite.
Das bedeutet deine Datei hätte dann eine gesamt weite im Speicher von 503808 Pixeln.

Oder du erklärst es zu ungenau...aber dafür können wir ja nichts.

Zitat:

Zitat von EWeiss (Beitrag 1365746)
Also Konstruktive Dinge wären durchaus angebracht.

Gerne, aber dazu musst du auch mal die Ideen der anderen akzeptieren und überlegen, ob die vielleicht stimmen könnten.
Konstruktive Vorschläge sind erst konstruktiv, wenn sie auch umgesetzt werden.

EWeiss 28. Mär 2017 11:32

AW: AnimatePNG
 
Zitat:

Diese Funktion nimmt alle Frames aus einer APNG und schreibt die hintereinander in ein großes Bitmap:
Nö tut sie nicht.
Was steht den da? BitmapToImage

Das was ich meinte war der Beitrag (code da drüber).
For k := bla, bla.

BitmapToImage konvertiert lediglich 1 HBitmap in ein GDIplus fähiges Image.

Zitat:

Der Ton macht die Musik!
Ach ja?
Was soll man von solchen Sprüchen halten.

Zitat:

Um es ein die analoge Welt zu übersetzen:
Du packst das Blätter-Paket mit den Bildern aus und klebst alle Bilder hintereinander auf eine lange Papierrolle und versuchst diese abzuspielen.
Das diese Rolle dann zu lang wird, um sie ohne "knittern" und "einreißen" bedienen zu können sollte eigentlich auf der Hand liegen.
Versuche doch mal lieber den Ansatz, einfach die linke obere Ecke zu tackern und das Blätter-Paket wie ein Daumenkino zu bedienen.
Sowas kann man sich sparen und verursacht nur böses Blut.
Sachlich bleiben ohne das sorry dumme Gewäsch.

Und nun möchte ich dich bitten hier im Thread keinen Stress zu verursachen.

gruss

EWeiss 28. Mär 2017 12:32

AW: AnimatePNG
 
@jaenicke

Hab mal ein Pic angehängt bei dem man sehen kann wie die Bilder temporär abgelegt werden bevor sie zu einem Image kombiniert werden.
Man sieht nicht viel aber es lässt einen erahnen was passiert wenn man eine Datei mit 984 Frames bearbeiten muss.
Ich glaube deshalb das GDI+ das einfach nicht schafft.

14 Frames..

gruss

Delphi-Laie 28. Mär 2017 12:46

AW: AnimatePNG
 
Also, ich begrüße es, daß Emil sich einer solchen Herausforderung stellt und empfinde diesen Angriff auf ihn als deplaciert.

EWeiss 28. Mär 2017 12:59

AW: AnimatePNG
 
Zitat:

Also, ich begrüße es, daß Emil sich einer solchen Herausforderung stellt
Ich versuche ja alles damit es läuft das kannst du schon daran erkennen wie viele neue Threads ich in letzter zeit erstellt habe.
Alles kann man halt nicht wissen.
Da ist man wie vor :wall: gestoßen.

Aber gut sei's drum ;)

gruss

EWeiss 28. Mär 2017 13:41

AW: AnimatePNG
 
Sorry nochmal..
Hier ein PIC welchen Unterschied es macht ob man DrawImage oder Cached Bitmap verwendet.

120 Bilder werden gezeichnet.
Oben ist DrawImage.
Bin mir nur nicht klar darüber wie gdipDrawImageRectRectI mir gdipDrawCachedBitmap ersetzen soll.
Ich brauche die zweite Dimension von gdipDrawImageRectRectI.

Das Teil ist 3x mal so schnell. 25% CPU / 3 = 8,3 damit könnte ich leben.
Hmmm... muss denken . LOL.

gruss

Neutral General 28. Mär 2017 13:47

AW: AnimatePNG
 
Du benutzt gdipDrawImageRectRectI quasi genauso wie gdipDrawCachedBitmap nur dass du nicht 10 einzelne Bilder hast sondern 1 Bild aus dem du nur einen Ausschnitt zeichnest, den du darstellen willst.
Dafür gibts die src und dest Parameter. srcX/Y/Width/Height sind das Rechteck dass aus dem Bild mit den Einzelbildern ausgeschnitten wird und destX/Y/Width/Height ist das Rechteck in dem der ausgeschnittene Teil dargestellt werden soll. Also wahrscheinlich 0,0,Einzelbild.Width,Einzelbild.Height.

Oder hab ich was falsch verstanden?

EWeiss 28. Mär 2017 13:53

AW: AnimatePNG
 
Zitat:

Zitat von Neutral General (Beitrag 1365779)
Du benutzt gdipDrawImageRectRectI quasi genauso wie gdipDrawCachedBitmap nur dass du nicht 10 einzelne Bilder hast sondern 1 Bild aus dem du nur einen Ausschnitt zeichnest, den du darstellen willst.
Dafür gibts die src und dest Parameter. srcX/Y/Width/Height sind das Rechteck dass aus dem Bild mit den Einzelbildern ausgeschnitten wird und destX/Y/Width/Height ist das Rechteck in dem der ausgeschnittene Teil dargestellt werden soll. Also wahrscheinlich 0,0,Einzelbild.Width,Einzelbild.Height.

Oder hab ich was falsch verstanden?

ImageRectI
Delphi-Quellcode:
GDIP_DrawImageRectRectI(PngGraphics, PngImage, X, Y, w, h, w * integer
  (CurPngPlayInfo.PngFrame) - w, 0, w, h, 2, nil, False, nil);
gdipDrawCachedBitmap hat nur die Weite und die höhe.
Dieser Part ist besonders wichtig weil er das Bild im Bild von der Aktuellen Frame Position zeichnet.
Delphi-Quellcode:
w * integer
  (CurPngPlayInfo.PngFrame) - w
Ich möchte vom GDIP_DrawImageRectRectI weg und anstelle dessen gdipDrawCachedBitmap verwenden weil es 3x mal schneller ist.
Glaube aber das es so nicht umsetzbar ist.

gruss

Neutral General 28. Mär 2017 13:59

AW: AnimatePNG
 
Kannst du grad nochmal sagen wo es grad hängt. Bin grad etwas raus sorry.
Der Aufruf sieht doch in Ordnung aus. Bis auf den vorletzten Parameter zumindest, dem du laut Internet eine Callback Funktion übergeben sollst.
Da passt false dann nicht.

EWeiss 28. Mär 2017 14:03

AW: AnimatePNG
 
Zitat:

Zitat von Neutral General (Beitrag 1365781)
Kannst du grad nochmal sagen wo es grad hängt. Bin grad etwas raus sorry.
Der Aufruf sieht doch in Ordnung aus. Bis auf den vorletzten Parameter zumindest, dem du laut Internet eine Callback Funktion übergeben sollst.
Da passt false dann nicht.

Es geht darum die Geschwindigkeit bzw. die Auslastung der CPU zu minimieren.
Die Funktion gdipDrawCachedBitmap ist dreimal so schnell wie die von mir aktuell verwendete GDIPDrawImageRectRectI.
Da gdipDrawCachedBitmap nur zwei Parameter hat Weite\Höhe habe ich das Problem GDIPDrawImageRectRectI zu ersetzen.

Muss mal sehn vielleicht finde ich noch eine anderer Lösung. ;)

Zitat:

Da passt false dann nicht.
false ist OK ;)
Delphi-Quellcode:
callback: BOOL; callbackData: Pointer


gruss

Neutral General 28. Mär 2017 14:19

AW: AnimatePNG
 
Achso, ich habs genau andersrum verstanden.
In der APNG Datei sind doch so viele Einzelbilder enthalten wie Frames in der Animation wenn ich das richtig verstanden habe.
Dann musst du ja nur alle Einzelbilder laden und nacheinander mit gdipDrawCachedBitmap zeichnen.

Wieso baust du dir denn überhaupt ein Bild in dem alle Einzelbilder enthalten sind um sie dann quasi beim Zeichnen wieder zu trennen?

EWeiss 28. Mär 2017 14:31

AW: AnimatePNG
 
Zitat:

Wieso baust du dir denn überhaupt ein Bild in dem alle Einzelbilder enthalten sind um sie dann quasi beim Zeichnen wieder zu trennen?
Baue ich ja nicht das ist das Standard Format von APNG.

gruss

jaenicke 28. Mär 2017 14:38

AW: AnimatePNG
 
Zitat:

Zitat von EWeiss (Beitrag 1365786)
Baue ich ja nicht das ist das Standard Format von APNG.

In der Datei stehen ein Standardbild und für jeden Frame ein weiterer Chunk mit dem PNG Bild für diesen Frame. Dort gibt es kein großes Bild.

Neutral General 28. Mär 2017 14:40

AW: AnimatePNG
 
Im Zweifelsfall kannst du halt auch aus dem großen Bild mit allen Frames beim Laden manuell eine Liste von Einzelbildern erstellen und diese dann mit gdipDrawCachedBitmap Zeichnen.

EWeiss 28. Mär 2017 14:47

AW: AnimatePNG
 
Zitat:

Zitat von jaenicke (Beitrag 1365789)
Zitat:

Zitat von EWeiss (Beitrag 1365786)
Baue ich ja nicht das ist das Standard Format von APNG.

In der Datei stehen ein Standardbild und für jeden Frame ein weiterer Chunk mit dem PNG Bild für diesen Frame. Dort gibt es kein großes Bild.

Verstehe jetzt nicht was du meinst.

EDIT:
Das Standard Bild gibt es aber auch nur weil ich dafür gesorgt habe, und die APNG von hinten lese. Zudem habe ich dem Header noch den Chunk "ANIM" hinzugefügt.
Normalerweise wird der Header bzw. die Chunks vom Anfang gelesen "IHDR" und bei den normalen APNG Dateien gibt es auch kein Standbild das man
mit normalen Bildanzeigern anzeigen könnte.

Ich bin aber am überlegen das Abwählbar zu machen.. später irgendwann ;)
Es ist ein geschütztes Format das du auch mit anderen APNG Anzeiger Programmen nicht Animieren kannst.
Dort wird jeweils nur 1 Frame angezeigt.

gruss

TiGü 28. Mär 2017 15:11

AW: AnimatePNG
 
Zitat:

Zitat von EWeiss (Beitrag 1365796)
Zitat:

Zitat von jaenicke (Beitrag 1365789)
Zitat:

Zitat von EWeiss (Beitrag 1365786)
Baue ich ja nicht das ist das Standard Format von APNG.

In der Datei stehen ein Standardbild und für jeden Frame ein weiterer Chunk mit dem PNG Bild für diesen Frame. Dort gibt es kein großes Bild.

Verstehe jetzt nicht was du meinst.

Das APNG ist kein durchgehendes großes Bild mit Gesamtbreite = Frameanzahl * Einzelbildbreite.
Es ist ein Container mit mehreren einzelnen Bildern.
Die kann man wie ein Daumenkino einzeln "abspielen" und muss sie nicht auf eine Rolle zusammen tackern und hinterher von der Rolle wieder "ausschneiden".

EWeiss 28. Mär 2017 15:14

AW: AnimatePNG
 
Ok.. Gut beschrieben jetzt weis ich was er meinte.

Zitat:

Das APNG ist kein durchgehendes großes Bild mit Gesamtbreite
Aber!
Eine kleine Berichtigung wenn es erstellt wird schon..

siehe http://www.delphipraxis.net/1365760-post99.html
Das Bild dort.

gruss

TiGü 28. Mär 2017 15:30

AW: AnimatePNG
 
Zitat:

Zitat von EWeiss (Beitrag 1365807)
Zitat:

Das APNG ist kein durchgehendes großes Bild mit Gesamtbreite
Aber!
Eine kleine Berichtigung wenn es erstellt wird schon..

siehe http://www.delphipraxis.net/1365760-post99.html
Das Bild dort.

Ja, aber das ist halt nur in deinen Lösungsansatz so!
Du selbst erstellst aus dem Container ein riesiges langes Bild.
Das macht das APNG nicht, das kann da nichts für!

EWeiss 28. Mär 2017 15:34

AW: AnimatePNG
 
@Delphi-Laie
Also nochmal genauer zu deinen Problem mit der Gif Datei.
Die Maximale Höhe und Weite in Photoshop für Bitmaps ist limitiert auf 32767.
Die Ausmaße deiner Bitmap (Gif) setzen sich wie folgt zusammen.

984 * 200 * 200 * 4;
Wenn ich dann von einem Ausmaß 250x250 ausgehe wirst du in etwa mit 17 GB vorhandenen Speicher ausgehen müssen.
Nun sollte dir klar sein warum sich diese Datei nicht speichern lässt und mit einem Win32Error quittiert wird.

Mehr Informationen darüber kannst du hier erfahren.
http://stackoverflow.com/questions/2...arp-net-bitmap

Ich werde wohl noch ein Limit hinzufügen müssen.

gruss

EWeiss 28. Mär 2017 15:37

AW: AnimatePNG
 
Zitat:

Zitat von TiGü (Beitrag 1365813)
Zitat:

Zitat von EWeiss (Beitrag 1365807)
Zitat:

Das APNG ist kein durchgehendes großes Bild mit Gesamtbreite
Aber!
Eine kleine Berichtigung wenn es erstellt wird schon..

siehe http://www.delphipraxis.net/1365760-post99.html
Das Bild dort.

Ja, aber das ist halt nur in deinen Lösungsansatz so!
Du selbst erstellst aus dem Container ein riesiges langes Bild.
Das macht das APNG nicht, das kann da nichts für!

Nein nur wenn das Gif extrahiert wird später wird dieser Strip in einem Bild zusammen gefügt.
So wie es auch der Standard bei APNG ist.
Oder kannst du irgendwo sehen das die APNG Dateien mehrere Bilder zur Ansicht haben?

gruss

Neutral General 28. Mär 2017 15:44

AW: AnimatePNG
 
Zitat:

Zitat von EWeiss (Beitrag 1365815)
Nein nur wenn das Gif extrahiert wird später wird dieser Strip in einem Bild zusammen gefügt.
So wie es auch der Standard bei APNG ist.
Oder kannst du irgendwo sehen das die APNG Dateien mehrere Bilder zur Ansicht haben?

Jede Frame in einem APNG beginnt mit einem fdAT-Chunk in dem Höhe/Breite, Offset etc. der Frame und nachfolgend die Bilddaten enthalten sind.
So steht es in der APNG-Spezifikation:

https://wiki.mozilla.org/APNG_Specif...ame_Data_Chunk

EWeiss 28. Mär 2017 15:46

AW: AnimatePNG
 
Zitat:

Zitat von Neutral General (Beitrag 1365817)
Zitat:

Zitat von EWeiss (Beitrag 1365815)
Nein nur wenn das Gif extrahiert wird später wird dieser Strip in einem Bild zusammen gefügt.
So wie es auch der Standard bei APNG ist.
Oder kannst du irgendwo sehen das die APNG Dateien mehrere Bilder zur Ansicht haben?

Jede Frame in einem APNG beginnt mit einem fdAT-Chunk in dem Höhe/Breite, Offset etc. der Frame und nachfolgend die Bilddaten enthalten sind.
So steht es in der APNG-Spezifikation:

https://wiki.mozilla.org/APNG_Specif...ame_Data_Chunk

Ja wo ist nun das Problem habe es doch so umgesetzt. ;)
Ist mir soweit bekannt andernfalls würde mein Projekt nicht laufen.
Das Problem ist nur es gibt kein festes Format (Spezifikation) jeder kocht sein eigenes Süppchen.

Versuch es doch mal meine APNG Dateien in einem anderen Player zu öffnen.

Zitat:

The "output buffer" is a pixel array with dimensions specified by the width and height parameters of the PNG `IHDR` chunk
Bei normalen APNG Dateien nicht bei meinen.
Bei mir liest er sich von hinten damit das erste Bild als Standbild fungieren kann, bzw. als ganz normale PNG angezeigt werden kann.
Und mein Chunk (Header) ist "ANIM"

gruss

jaenicke 28. Mär 2017 16:00

AW: AnimatePNG
 
Nur gibt es ein Standbild auch beim normalen APNG Standard. Insofern wäre es da nicht nötig gewesen etwas eigenes zu erfinden. Aktuell sehe ich keinen Vorteil von deinem Standard, außer dass kein anderes Tool damit kompatibel ist.

Das kannst du übrigens selbst testen, indem du einmal mit dem Internet Explorer (der das Format nicht unterstützt) und einmal mit Firefox (der das Format unterstützt) auf die Wiki-Seite zu APNG gehst. Ersterer zeigt das Standbild, letzterer die Animation.

EWeiss 28. Mär 2017 16:02

AW: AnimatePNG
 
Zitat:

Nur gibt es ein Standbild auch beim normalen APNG Standard.
Hab noch keins gesehen bei mir animieren die sofort.
Es bestände ja die Möglichkeit das einige Leute ihre Werke schützen möchten.
Schon mal daran gedacht.? ;)

gruss


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:48 Uhr.
Seite 3 von 4     123 4      

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