Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Bitmaps als Gif mit animation speichern (https://www.delphipraxis.net/158821-bitmaps-als-gif-mit-animation-speichern.html)

thomas2009 4. Mär 2011 10:23

Bitmaps als Gif mit animation speichern
 
Hi
ich suche eine Funktion (kostenlos oder egal) um ein animiertes Gif-Bild zu erstellen

s.h.a.r.k 4. Mär 2011 13:03

AW: Bitmaps als Gif mit animation speichern
 
Seit Delphi 2010 (oder Delphi 2009) ist TGifImage (in der Unit gifimage) in den VCL-Source übernommen worden. Die Komponente stammt von hier. Dort meine ich auch mal eine Demo gefunden zu haben, in gezeigt wird, wie man Images zu einer GIF-Animation zusammenfügen und speichern kann.

-- EDIT
Habe gerade nochmals nachgeschaut und bin hier fündig geworden :)

Chriscode 10. Feb 2012 14:35

AW: Bitmaps als Gif mit animation speichern
 
da sich der ursprüngliche Fragesteller nicht dafür bedankt hat möchte ich dies gerne hiermit nachholen:

Vielen Dank s.h.a.r.k :thumb:

(Mir ist bewusst das es ein alter Topic ist aber über die Suche habe ich diese hilfreiche Antwort gefunden und möchte mich entsprechend bedanken da dies bisher noch nicht erfolgt ist)

delnu 28. Jan 2014 21:33

AW: Bitmaps als Gif mit animation speichern
 
Völlig egal, wie alt das Thema ist, so bleibt es dennoch EXTREM nützlich ! Auch ich möchte mich an dieser Stelle ganz herzlich bedanken :!: :thumb: 8-):dance:

Das ist ganz genau das, was ich brauche, um ein Smiley-Programm fertig stellen zu können.

Erheblich besser als dieser aufgeblähte :evil: Ballast, den man mit der zudem fehlerbehafteten :wall: Jedi-Bibliothek :feuerchen: rumschleppen müßte.

Harry Stahl 4. Mär 2022 22:59

AW: Bitmaps als Gif mit animation speichern
 
War gerade auch auf der Suche nach einer Möglichkeit mehrere Bitmaps in einer animierten GIF-Datei zu speichern.

Der obige Link führt zu einer Seite, wo man die Unit FTGifAnimate laden kann.

GifImage habe ich ersetzt durch "GIFImg" und "GIFConsts".

Leider kompiliert die unit nicht, weil an 3 Stellen ein TGIFSubImage erwartet wird, das der Compiler nicht kennt.

Hat jemand ein Tipp, wie man das Problem lösen kann?

Oder gibt es inzwischen eine andere (evtl. sogar in Delphi integrierte) Lösung, wie man mehrere Bitmaps als ein animiertes GIF speichern kann?

venice2 5. Mär 2022 08:51

AW: Bitmaps als Gif mit animation speichern
 
TGIFSubImage is now named TGIFFrame..
Wobei das hier deine TGIFSubImage class enthält.

Zitat:

Der obige Link führt zu einer Seite, wo man die Unit FTGifAnimate laden kann.
Zitat:

Requires the TGIFImage unit.
Und in dieser ist TGIFSubImage class enthalten.

Harry Stahl 5. Mär 2022 14:21

AW: Bitmaps als Gif mit animation speichern
 
Ja, danke. Auf die Idee , TGifSubImage könnte durch TGifFrame ersetzt worden sein, war ich auch schon gekommen, allerdings die FTGifAnimate unit funktioniert dann nicht, wenn ich einfach TGifSubImage durch TGifFrame ersetze (und statt GifImage die Delphi VCL.Imaging Gif units verwende).

Wenn ich das Bespiel mit der Gifmage-Unit aus Deinem Link verwende, kompiliert es und läuft, beim Speichern als Gif-Datei erhalte ich allerdings die Fehlermeldung "Unsupported GIF Version".

Gibt es evtl. irgendwo eine neuere FTGifAnmiate Unit, die auf Delphis GifUnits angepasst wurde?

tomkupitz 5. Mär 2022 15:19

AW: Bitmaps als Gif mit animation speichern
 
Hallo Harry,

ich habe das so gelöst (schon etwas her):

Code:
function ConvertBitmapTo8Bit(bmp: TBitmap): TBitmap;
var jpg: TJpegImage;

begin
  if bmp<>nil then
  begin
    jpg:=TJpegImage.Create;
    jpg.CompressionQuality:=100;
    jpg.Assign(bmp);

    jpg.JPEGNeeded;
    jpg.PixelFormat:=jf8bit;
    jpg.DibNeeded;

    result:=TBitmap.Create;
    result.PixelFormat:=pf8bit;
    result.Assign(jpg);

    jpg.Free;
  end
  else
    result:=nil;
end;

//

procedure ExportGIF(FileName: string);
var Bitmap24Bit, Bitmap8Bit: TBitmap;

    i: Integer;

  function AddBitmap(GIF: TGIFImage; Source: TBitmap; Transparent: Boolean; Delay: Integer): TGIFFrame;
  var
    GCE: TGIFGraphicControlExtension;
    LoopExt: TGIFAppExtNSLoop;

  begin
    result:=GIF.Add(Source);

    if (GIF.Images.Count=1) then
    begin
      LoopExt:=TGIFAppExtNSLoop.Create(Result);
      LoopExt.Loops:=0;
    end;

    GCE:=TGIFGraphicControlExtension.Create(result);
    GCE.Delay:=Round(Delay/10);

    if Transparent then
    begin
      GCE.Transparent:=True;
      GCE.TransparentColorIndex:=result.Pixels[0, result.Image.Height-1]
    end;
  end;

var
  GIF: TGIFImage;
  OptimizeOptions: TGIFOptimizeOptions;

begin
  GIF:=TGIFImage.Create;

  for i:=0 to BitmapCount-1 do
  begin
    Bitmap24Bit:=HoleBitmap(i);
   
    if Bitmap24Bit<>nil then
    begin  
      Bitmap8Bit:=ConvertBitmapTo8Bit(Bitmap24Bit);

      if Bitmap8Bit<>nil then
      begin
        AddBitmap(GIF, Bitmap8Bit, False, Round(1000/FramesPerSecond));
        Bitmap8Bit.Free;
      end;
     
      Bitmap24Bit.Free;
    end;
  end;

  GIF.OptimizeColorMap;

  OptimizeOptions := [];
  include(OptimizeOptions, ooMerge);
  include(OptimizeOptions, ooCrop);

  GIF.Optimize(OptimizeOptions, rmNone, dmNearest, 0);

  GIF.SaveToFile(FileName);
  GIF.Free;
end;
Beste Grüße

Harry Stahl 5. Mär 2022 15:38

AW: Bitmaps als Gif mit animation speichern
 
Danke Dir.

Unter

https://stackoverflow.com/questions/...sing-tgifimage

habe ich das gefunden, geht anscheinend noch einfacher?

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  Bmp: TBitmap;
  Gif: TGIFImage;
begin
  Bmp := TBitmap.Create;
  Gif := TGIFImage.Create;
  try
    Bmp.LoadFromFile('img0.bmp');
    Bmp.Transparent := True;
    Gif.Add(Bmp);
    Bmp.LoadFromFile('img1.bmp');
    Bmp.Transparent := True;
    Gif.Add(Bmp);
    Bmp.LoadFromFile('img2.bmp');
    Bmp.Transparent := True;
    Gif.Add(Bmp);
    Bmp.LoadFromFile('img3.bmp');
    Bmp.Transparent := True;
    Gif.Add(Bmp);

    // add netscape loop if we want animation to keep repeating
    TGIFAppExtNSLoop.Create(Gif.Images.Frames[0]).Loops := 0;
    Gif.Pack;
    Gif.SaveToFile('test.gif');
  finally
    Bmp.Free;
    Gif.Free;
  end;
end;

Harry Stahl 5. Mär 2022 17:15

AW: Bitmaps als Gif mit animation speichern
 
@tomkupitz

OK, jetzt habe ich es verstanden (Anpassung der FTGifAnimate-Parts). Cool!


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:51 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