![]() |
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. |
AW: AnimatePNG
Zitat:
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 |
AW: AnimatePNG
Zitat:
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.... |
AW: AnimatePNG
Zitat:
Ich muss dazu aber die normale nicht die von mir angepasste GDI+ verwenden dazu muss ich eine VCL Anwendung erstellen. gruss |
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. |
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.
|
AW: AnimatePNG
Zitat:
Entschuldige. gruss |
AW: AnimatePNG
Emil, das Angebot Sebastians schlägst Du aus? Das ist ja immerhin wie ein Vierer im Lotto!
Zitat:
Zitat:
Zitat:
|
AW: AnimatePNG
Zitat:
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 |
AW: AnimatePNG
Zitat:
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 |
AW: AnimatePNG
Zitat:
|
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:
Hier gibt es dann einen Win32Error.
function TfrmMain.SaveToPNG(FullName: PWideChar; img: GPImage): GPStatus;
var encoderCLSID: TGUID; begin GetEncoderClsid('image/png', encoderCLSID); Result := GdipSaveImageToFile(img, FullName, @encoderCLSID, nil); end; gruss |
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. |
AW: AnimatePNG
Zitat:
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:
Und die stehen im Speicher hintereinander.
Delphi-Quellcode:
Zurück wird dann 1 Image geliefert das alle Frames enthält.
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;
Delphi-Quellcode:
Result := BitmapToImage(imgHDC);
gruss |
AW: AnimatePNG
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. 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. |
AW: AnimatePNG
Zitat:
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:
Also ruhig Blut. Also Konstruktive Dinge wären durchaus angebracht. gruss |
AW: AnimatePNG
Zitat:
Der Ton macht die Musik! Zitat:
Zitat:
Zitat:
Konstruktive Vorschläge sind erst konstruktiv, wenn sie auch umgesetzt werden. |
AW: AnimatePNG
Zitat:
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:
Was soll man von solchen Sprüchen halten. Zitat:
Sachlich bleiben ohne das sorry dumme Gewäsch. Und nun möchte ich dich bitten hier im Thread keinen Stress zu verursachen. gruss |
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 |
AW: AnimatePNG
Also, ich begrüße es, daß Emil sich einer solchen Herausforderung stellt und empfinde diesen Angriff auf ihn als deplaciert.
|
AW: AnimatePNG
Zitat:
Alles kann man halt nicht wissen. Da ist man wie vor :wall: gestoßen. Aber gut sei's drum ;) gruss |
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 |
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? |
AW: AnimatePNG
Zitat:
Delphi-Quellcode:
gdipDrawCachedBitmap hat nur die Weite und die höhe.
GDIP_DrawImageRectRectI(PngGraphics, PngImage, X, Y, w, h, w * integer
(CurPngPlayInfo.PngFrame) - w, 0, w, h, 2, nil, False, nil); Dieser Part ist besonders wichtig weil er das Bild im Bild von der Aktuellen Frame Position zeichnet.
Delphi-Quellcode:
Ich möchte vom GDIP_DrawImageRectRectI weg und anstelle dessen gdipDrawCachedBitmap verwenden weil es 3x mal schneller ist.
w * integer
(CurPngPlayInfo.PngFrame) - w Glaube aber das es so nicht umsetzbar ist. gruss |
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. |
AW: AnimatePNG
Zitat:
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:
Delphi-Quellcode:
callback: BOOL; callbackData: Pointer
gruss |
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? |
AW: AnimatePNG
Zitat:
gruss |
AW: AnimatePNG
Zitat:
|
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.
|
AW: AnimatePNG
Zitat:
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 |
AW: AnimatePNG
Zitat:
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". |
AW: AnimatePNG
Ok.. Gut beschrieben jetzt weis ich was er meinte.
Zitat:
Eine kleine Berichtigung wenn es erstellt wird schon.. siehe ![]() Das Bild dort. gruss |
AW: AnimatePNG
Zitat:
Du selbst erstellst aus dem Container ein riesiges langes Bild. Das macht das APNG nicht, das kann da nichts für! |
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. ![]() Ich werde wohl noch ein Limit hinzufügen müssen. gruss |
AW: AnimatePNG
Zitat:
So wie es auch der Standard bei APNG ist. Oder kannst du irgendwo sehen das die APNG Dateien mehrere Bilder zur Ansicht haben? gruss |
AW: AnimatePNG
Zitat:
So steht es in der APNG-Spezifikation: ![]() |
AW: AnimatePNG
Zitat:
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:
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 |
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. |
AW: AnimatePNG
Zitat:
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 20:36 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-2025 by Thomas Breitkreuz