Thema: AnimatePNG

Einzelnen Beitrag anzeigen

EWeiss
(Gast)

n/a Beiträge
 
#150

AW: AnimatePNG

  Alt 5. Apr 2017, 05:00
Quelltext von GifToAPNG hochgeladen so könnt ihr sehen wie die PNG zurecht gemacht wird.
Ich habe den nicht mehr optimiert wenn es jemand machen möchte bitte habe nichts dagegen.
Man kann das noch schöner machen.

Vernünftige Ausgabe der Fehlerbehandlung.
Quelltext optimieren in Klasse.
Progressbar addieren.. usw.

Anmerkung:
Die Flat API für GDIPlus ist von turboPASCAL.

EDIT:
Quelltext inklusive TPngAnimate Class addiert.


Für diejenigen die es interessiert wie ich die 25% Cpu Auslastung minimiert habe.
Vorher habe ich GdipDrawImageRectRectI verwendet.
Jetzt erstelle ich vorher ein Array der einzelnen Bilder im APNG.

GetImagefromFile
Delphi-Quellcode:
  if GDIP_CreateFromHDC(DC, PngGraphics) = OK then
  begin
    if not Assigned(gp.cBitmap) then
    begin
      SetLength(gp.cBitmap, gp.FrameCount);
      for i := 0 to High(gp.cBitmap) do
      begin
        GDIP_CloneBitmapAreaI(w * (i + 1) - w, 0, w, h, PixelFormat32bppARGB, gp.PngImage,
          gp.cBitmapClone);
        GDIP_CreateCachedBitmap(Pointer(gp.cBitmapClone), PngGraphics, gp.cBitmap[i]);
        GDIP_DisposeImage(gp.cBitmapClone);
      end;
    end;
    GDIP_DeleteGraphics(PngGraphics);
  end;
Ich kopiere den Bereich im ImageStrip vom APNG mit CloneBitmapAreaI.
Anschließend erstelle ich das Array cBitmap mit CreateCachedBitmap die Bilder werden dann in DrawPngFrame gezeichnet.

Delphi-Quellcode:
// einzelnes Bild auf Graphicsobjekt zeichnen
if gp.FrameCount = 0 then
begin
  GDIP_DrawCachedBitmap(PngGraphics, gp.cBitmap[0], X, Y);
  LoopCount := 0;
end
else
  GDIP_DrawCachedBitmap(PngGraphics, gp.cBitmap[FrameNum], X, Y);
natürlich werden die Ressourcen auch wieder freigegeben an erster Position in GetImagefromFile.
Delphi-Quellcode:
  if gp.PngImage <> 0 then
    GDIP_DisposeImage(gp.PngImage);

  if Assigned(gp.cBitmap) then
  begin
    for i := 0 to High(gp.cBitmap) do
    begin
      GDIP_DeleteCachedBitmap(gp.cBitmap[i]);
      gp.cBitmap[i] := nil; // ob das nötig ist da bin ich nicht so sicher.
    end;
    gp.cBitmap := nil; // Das Array wird ja hier komplett auf Nil gesetzt
  end;

Das war's soweit.
Stress Bitmap
Animationen.. Bei Bilder Klicken und gesamten Ordner Herunterladen sind nur 330MB

gruss

Geändert von EWeiss ( 5. Apr 2017 um 10:22 Uhr)
  Mit Zitat antworten Zitat