Delphi-PRAXiS
Seite 8 von 16   « Erste     678 910     Letzte »    

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)

EWeiss 25. Mär 2017 06:47

AW: AnimatePNG
 
APNG Format funktioniert jetzt soweit.
2 Problem stehen noch an.

1. Transparenz wieder herstellen nach
Delphi-Quellcode:
GDIP_CreateBitmapFromHBITMAP(Bitmap, 0, pBitmap);


2. Etwas an der Schraube drehen was die CPU Belastung angeht. (Mache da noch irgend etwas falsch.) :)
Normalerweise sollte diese Gegen 0% gehen.

Anschließend muss ich noch ein Tool erstellen mit dem man APNG Dateien erstellen kann (Drag-Drop) sollte reichen.

Mein Problem mit der Transparenz ist das ich hier kein TBitmap verwende dem ich einfach das HBitmap als Handle übergeben könnte.
Hab noch nicht die richtige Lösung für das Problem gefunden.

gruss

Delphi-Laie 26. Mär 2017 15:56

AW: AnimatePNG
 
Ich las jetzt alle Deine Beiträge durch, Emil, aber eine Aussage konnte ich nicht entdecken, deshalb frage ich danach: Ist es angedacht, irgendwann einmal eine Konvertierungsfunktion von gif nach apng (und ggf. sogar zurück) anzubieten?

Gruß Delphi-Laie

EWeiss 26. Mär 2017 15:59

AW: AnimatePNG
 
Zitat:

Zitat von Delphi-Laie (Beitrag 1365570)
Ich las jetzt alle Deine Beiträge durch, Emil, aber eine Aussage konnte ich nicht entdecken, deshalb frage ich danach: Ist es angedacht, irgendwann einmal eine Konvertierungsfunktion von gif nach apng (und ggf. sogar zurück) anzubieten?

Gruß Delphi-Laie

Ja.. Das ist der sinn der Sache.
Zurück nicht hin ja. Gif -> Apng

gruss

EWeiss 26. Mär 2017 19:48

AW: AnimatePNG
 
Ich versuche ein HBitmap in ein GDIPlus konformes Format zu bringen

Delphi-Quellcode:
function BitmapToImage(Hdib: HBitmap): Pointer;
var
  lpImg: Pointer;
  bi: tagBITMAPINFO;
  bm: Bitmap;
  BitmapLength: LongWord;
  bmpBits: TBytes;
  DC: HDC;
begin
  Result := nil;

  DC := GetDc(0);

  if Hdib <> 0 then
  begin
    GetObject(Hdib, sizeof(bm), @bm);

    bi.bmiHeader.biSize       := SIZEOF(bi.bmiHeader);
    bi.bmiHeader.biWidth      := bm.bmWidth;
    bi.bmiHeader.biHeight     := -bm.bmHeight;
    bi.bmiHeader.biPlanes     := 1;
    bi.bmiHeader.biBitCount   := 32;
    bi.bmiHeader.biCompression := BI_RGB;

    BitmapLength := bm.bmWidth * bm.bmHeight * 4;
    SetLength(bmpBits, BitmapLength + 1);

    GetDIBits(DC, Hdib, 0, bm.bmHeight, @bmpBits[0], bi, DIB_RGB_COLORS);

    if @bmpBits[0] <> nil then
    begin
      if Gdip_CreateBitmapFromScan0(bm.bmWidth, bm.bmHeight, bm.bmWidth * 4, PixelFormat32bppARGB,
        @bmpBits[0], lpImg) = OK then
          Result := lpImg;
    end;
    ReleaseDC(0, DC);
  end;
end;
Es läuft alles durch nur beim aufruf von
GDIP_DrawImageRectRectI kracht es mal wieder.

Ich sehen keinen Fehler in meinem Code.
Eventuell TBytes ?

gruss

EWeiss 26. Mär 2017 20:38

AW: AnimatePNG
 
Ok. APNG funktioniert nun soweit ohne das ich Tausende Units oder fremd Komponente einbinden musste.
Das Problem von oben.

Musste
Delphi-Quellcode:
bmpBits: TBytes;

in meine Classe TAnimatePNG Privat verschieben danach ging es.

Andererseits ist obige Funktion nicht das wahre vom Ei da ich dort ein unnötiges DC aufrufen muss.
Also dann besser so.

Ok zurück muss doch die obere verwenden diese hier ist wegen der Kompatibilität zu 16Bit.
Delphi-Quellcode:
function TAnimatePng.BitmapToImage(Hdib: HBitmap): Pointer;
type
  TByteArray = array of Byte;
var
  BitmapLength: LongWord;
  bi: tagBITMAP;
  lpImg: Pointer;
begin

  Result := nil;
  bmpBits := nil;

  GetObject(Hdib, sizeof(bi), @bi);

  BitmapLength := bi.bmWidth * bi.bmHeight * (bi.bmBitsPixel div 8);
  SetLength(bmpBits, BitmapLength + 1);
  GetBitmapBits(Hdib, BitmapLength, @bmpBits[0]);

  if @bmpBits[0] <> nil then
  begin
    if Gdip_CreateBitmapFromScan0(bi.bmWidth, bi.bmHeight, bi.bmWidth * 4, PixelFormat32bppARGB,
      @bmpBits[0], lpImg) = OK then
      Result := lpImg;
  end;

  DeleteObject(Hdib);
end;
gruss

EWeiss 26. Mär 2017 21:31

AW: AnimatePNG
 
OK. Hier neue Version mit APNG Support allerdings erst mal nur Binär da ich noch etwas an der CPU last schrauben muss.

Da ihr keine APNG Dateien habt müsst ihr das kleine Tool GifToAPNG verwenden.
Eine Animierte Gif Datei mit Drag Drop drauf ziehen danach wird eine Meldung ausgegeben wie viele Frames im APNG enthalten sind
und die Datei unter gleichen Namen mit der Erweiterung "PNG" abgespeichert.

Die Dateien können mit jedem Bild Viewer angesehen werden allerdings NICHT Animiert.
Es wird dann nur das erste Bild angezeigt.

Ihr könnt wenn das APNG abgespielt wird die Geschwindigkeit ändern und anschließend in das APNG speichern.

gruss

Delphi-Laie 27. Mär 2017 11:37

AW: AnimatePNG
 
Dieser Gif-Apng-Konverter funktioniert bei mir bei folgenden Gif-Dateien nicht:

http://sortierkino.bplaced.net/Sierp...rgroessern.gif
http://sortierkino.bplaced.net/Sierp...erkleinern.gif

Nach ein paar Sekunden zeigt er Frames=0 an, und eine apng-Datei wird auch nicht erstellt.

EWeiss 27. Mär 2017 16:24

AW: AnimatePNG
 
Na ja wenn mal ein, zwei Gifs nicht gehen ist das kein Problem.

greets

Delphi-Laie 27. Mär 2017 16:40

AW: AnimatePNG
 
Zitat:

Zitat von EWeiss (Beitrag 1365662)
Na ja wenn mal ein, zwei Gifs nicht gehen ist das kein Problem.

Na, das ist doch nicht ernsthaft Dein Anspruch als Programmierer?!

Wenn etwas "nicht geht", dann liegt evtl. ein grundsätzliches Problem vor.

Genaugenommen wollte ich genau diese beiden großen GIFs in APNGs verwandeln.

EWeiss 27. Mär 2017 17:15

AW: AnimatePNG
 
Zitat:

Zitat von Delphi-Laie (Beitrag 1365665)
Zitat:

Zitat von EWeiss (Beitrag 1365662)
Na ja wenn mal ein, zwei Gifs nicht gehen ist das kein Problem.

Na, das ist doch nicht ernsthaft Dein Anspruch als Programmierer?!

Wenn etwas "nicht geht", dann liegt evtl. ein grundsätzliches Problem vor.

Genaugenommen wollte ich genau diese beiden großen GIFs in APNGs verwandeln.

Der Konverter Redimensioniert die Frames von einem Gif auf die größe 512x512 wenn du 1000 Frames wie in deiner Gif vorhanden
auf die Größe von 512x512 umlegst was glaubst du ist davon noch zu zeichnen wenn ich die Komplette Datei dann in den Speicher lade.

Der Konverter ist aber im Moment mal nebensächlich.

Von dir mal abgesehen scheint nicht wirklich jemand Interesse an dem Teil zu haben daher lege ich das erst mal auf's Eis
da ich die CPU last nicht in den griff bekomme.


gruss


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:36 Uhr.
Seite 8 von 16   « Erste     678 910     Letzte »    

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