Entwickler-Ecke

Multimedia / Grafik - Animiertes Gif skalieren


pigfacejoe - Sa 11.10.08 15:35
Titel: Animiertes Gif skalieren
Hi,
folgendes Problem:
Ich möchte eine gif Animationen skalieren. Dazu möchte ich alle Einzelbilder skalieren.
Ich verwende die JVGifAnimator Komponente von den Jedi Komponenten.

Hier mal die Prozedur, die das ganze richten soll:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure skalieren(neww,newh:integer;var gif1:TJvGIFAnimator);
var z:integer;
begin
for z:= 1 to gif1.count-1 do //z läuft alle Einzelbilder durch
begin
gif1.image.Frames[z].Width:=neww;//und ediiert werden sie einzeln(Breite)
gif1.Image.Frames[z].Height:=newh;//Höhe
end;

das ganze klappt allerdings nicht, weil die Eigenschaft gif1.image.frames[z].width und .height "Nur Lesen-Eigenschaften " sind. Habt Ihr eine Idee wie ich alle Einzelbilder in der Grösse bearbeiten kann?

Gruß
Max


elundril - Sa 11.10.08 15:44

du könnest jedes bild extrahieren, dann skalieren unddie einzelbilder wieder zu einem gif zusammenfügen.


pigfacejoe - Sa 11.10.08 15:47

Zitat:

du könnest jedes bild extrahieren, dann skalieren unddie einzelbilder wieder zu einem gif zusammenfügen.

Genau das versuche ich ja mit obigen Quelltext zu bezwecken, nur weiss ich nicht, wie ich das anrichten soll ;-)


elundril - Sa 11.10.08 15:53

ich mein nicht nur jedes bild einzeln ansprechen sondern wirklich: frame nehmen, auf ein Bitmap kopieren, sklieren, nächsten frame nehmen, neues bitmap erzeugen, auf neues bitmap kopieren, skalieren,.... und zum schluss alle erzeugten bitmaps wieder zu einem gif zusammenfügen.

lg elundril


pigfacejoe - Sa 11.10.08 17:21

hello again ,
Ich habe es mal so versucht:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure skalieren(neww,newh:integer;var gif1:TJvGIFAnimator);
var z:integer;
Rect : TRect;
Bitmap : TBitmap;
begin
Bitmap := TBitmap.Create;
Rect.Left := 0;
Rect.Top := 0;
Rect.Right := neww;
Rect.Bottom := newh;
for z:= 1 to gif1.image.count-1 do
begin
bitmap:=gif1.Image.Frames[z].Bitmap;
gif1.image.Frames[z].Bitmap.Canvas.StretchDraw(Rect,Bitmap);
end;


Keine Fehlermeldung, alles was hier steht wird abgearbeitet, aber leider bleibt die grösse gleich...
Kann mir jm sagen , wieso?


Delete - Sa 11.10.08 17:45

Deine temporäre Bitmap wird ja auch nicht skaliert, sondern einfach nur zugewiesen. Mal aus dem Kopf:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
procedure skalieren(neww,newh:integer;var gif1:TJvGIFAnimator);
var z:integer;    
    Bitmap : TBitmap;
    R: TRect;
begin
  Bitmap := TBitmap.Create;
  try
    Bitmap.Width := neww;
    Bitmap.Height := newh;
    R := Rect(0,0,neww,newh);
    for z:= 0 to gif1.image.count-1 do
      begin
        bitmap.Canvas.StretchDraw(R,gif1.Image.Frames[z].Bitmap);
        gif1.image.Frames[z].Bitmap.Width := Bitmap.Width;
        gif1.image.Frames[z].Bitmap.Height := Bitmap.Height;
        gif1.image.Frames[z].Bitmap.Canvas.Draw(Bitmap);
      end;
  finally
    Bitmap.Free;
  end;
end;


Ungetestet, daher ohne Gewähr.


pigfacejoe - Sa 11.10.08 17:57

Danke, Prinzip verstanden.
Leider klappt das ganze trotzdem nicht...
Da, wo als Kommentar "HIER" steht, habe ich noch koordinaten eintragen müssen.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
procedure skalieren(neww,newh:integer;var gif1:TJvGIFAnimator);
var z:integer;
    Bitmap : TBitmap;
    R: TRect;
begin
  Bitmap := TBitmap.Create;
  try
    Bitmap.Width := neww;
    Bitmap.Height := newh;
    R := Rect(0,0,neww,newh);
    for z:= 0 to gif1.image.count-1 do
      begin
        bitmap.Canvas.StretchDraw(R,gif1.Image.Frames[z].Bitmap);
        gif1.image.Frames[z].Bitmap.Width := Bitmap.Width;
        gif1.image.Frames[z].Bitmap.Height := Bitmap.Height;
        gif1.image.Frames[z].Bitmap.Canvas.Draw(0,0,Bitmap);//HIER
      end;
  finally
    Bitmap.Free;
  end;


Wenn jemand einen heißen Tip hat, bitte posten ;-)