[PHP] Magickwand Animated Gifs

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • mcdronkz
  • Registratie: Oktober 2003
  • Laatst online: 16-04 12:44
Ik ben wat aan het experimenteren geslagen met MagickWand, nu lukt het mij met behulp van de volgende code een leuke animated gif te laten zien:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
$img = NewMagickWand();

MagickReadImage($img, "frame1.jpg");
MagickSetImageDelay($img, 50);

MagickReadImage($img, "frame2.jpg");
MagickSetImageDelay($img, 50);

MagickReadImage($img, "frame3.jpg");
MagickSetImageDelay($img, 50);

MagickSetFormat($img, "GIF"); //zorg voor het juiste formaat
header("Content-Type: image/gif"); //zorg voor de juiste headers
MagickEchoImagesBlob($img); //output het geheel
?>


Nu werkt dit dus door het laden van andere afbeeldingen, tot dusver geen probleem.

Maar je voelt 'm al aankomen: ik wil zelf afbeeldingen tekenen en in hetzelfde script (dus mbv. een "buffer") het spul als een animated gif outputten.

Nu is er een manual, maar ik zie door de bomen het bos niet meer.

Nu had ik al zoiets geprobeerd:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
$img = NewMagickWand();
MagickNewImage($img,250,250,"#FFFFFF");

$frame1 = NewDrawingWand();
DrawAnnotation($frame1,50,50,"Frame 1");

MagickDrawImage($img,$frame1); //inhoud van $frame1 naar $img schrijven
MagickSetImageDelay($img, 50); //pauze van een halve sec

$frame2 = NewDrawingWand();
DrawAnnotation($frame2,50,50,"Frame 2");

MagickDrawImage($img,$frame2); //inhoud van $frame2 naar $img schrijven
MagickSetImageDelay($img, 50); //pauze van een halve sec

MagickSetFormat($img, "GIF"); //zorg voor het juiste formaat
header("Content-Type: image/gif"); //zorg voor de juiste headers
MagickEchoImagesBlob($img); //output het geheel
?>


Maar dat resulteert in een afbeelding waar twee tekstjes over elkaar heenstaan.

Er zijn talloze functies, maar er is vrijwel niks aan code voorbeelden op internet te vinden, al helemaal niet over animated gifs. Enig idee hoe ik dit wél voor elkaar krijg ?

Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 14:28
Kan je ze niet gewoon in een temp directory opslaan als file?

Acties:
  • 0 Henk 'm!

  • DemonTPx
  • Registratie: December 2002
  • Laatst online: 09-04 10:49
Ik denk dat je je $img moet clearen voordat je $frame2 er overheen schijft ofzo?

Acties:
  • 0 Henk 'm!

  • mcdronkz
  • Registratie: Oktober 2003
  • Laatst online: 16-04 12:44
djluc schreef op woensdag 06 september 2006 @ 12:56:
Kan je ze niet gewoon in een temp directory opslaan als file?
Ik kan ook wel losse afbeeldingen maken, dat is opzich geen punt, maar het moet hoe dan ook mogelijk zijn om dit te kunnen doen in één bestand, wel zo overzichtelijk ook.
DemonTPx schreef op woensdag 06 september 2006 @ 13:00:
Ik denk dat je je $img moet clearen voordat je $frame2 er overheen schijft ofzo?
Als ik

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
$img = NewMagickWand();
MagickNewImage($img,250,250,"#FFFFFF");

$frame1 = NewDrawingWand();
DrawAnnotation($frame1,50,50,"Frame 1");

MagickDrawImage($img,$frame1); //inhoud van $frame1 naar $img schrijven
MagickSetImageDelay($img, 500); //pauze van een halve sec

$frame2 = NewDrawingWand();
DrawAnnotation($frame2,50,50,"Frame 2");

ClearMagickWand($img);
MagickNewImage($img,250,250,"#FFFFFF");

MagickDrawImage($img,$frame2); //inhoud van $frame2 naar $img schrijven

MagickSetFormat($img, "GIF"); //zorg voor het juiste formaat
header("Content-Type: image/gif"); //zorg voor de juiste headers
MagickEchoImagesBlob($img); //output het geheel
?>


doe, dan krijg ik frame 1 helemaal niet te zien.

Acties:
  • 0 Henk 'm!

  • soulrider
  • Registratie: April 2005
  • Laatst online: 27-11-2017
en als je nu tss frame1 en frame2 eerst er een leeg frame naartoe schrijft?

leeg
frame1 ( .5sec)
leeg (0sec)
frame2 (.5sec)

en dat laat lussen?

zo dat niet gaan

dan wordt de tekst van frame1 gecleard voordat frame2 erbij komt eh ;-)

en kan je anders ev. een linkje maken naar 't resultaat ?
zodat we 't effect zien van de animatie - omschrijving van een beeld zegt minder dan 't beeld zelve eh

Acties:
  • 0 Henk 'm!

  • mcdronkz
  • Registratie: Oktober 2003
  • Laatst online: 16-04 12:44
Ik heb zo snel geen linkje naar het resultaat omdat ik nu even in een intranet zit te werken, en geen beschikking heb over een externe server met MagickWand extensie. Die kun je uiteraard wel even installeren op een PHP 5.0.4 machine, niet op een nieuwere, want dat werkt niet. :)

Acties:
  • 0 Henk 'm!

  • Borizz
  • Registratie: Maart 2005
  • Laatst online: 24-08 20:35
Gebruik een solid (geen transparante) achtergrond voor elk frame, volgens mij wordt bij het afspelen van een GIF animatie elk frame over het andere frame getoond. Dus als je transparante achtergrond gebruikt in een frame zie je daardoor het vorige plaatje.

If I can't fix it, it ain't broken.


Acties:
  • 0 Henk 'm!

  • mcdronkz
  • Registratie: Oktober 2003
  • Laatst online: 16-04 12:44
Ik heb het gevonden !

Dit is een werkende code:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
$img = NewMagickWand();
MagickNewImage($img,250,250,"#FFFFFF");

$frame1 = NewDrawingWand();
DrawAnnotation($frame1,50,50,"Frame 1");

MagickDrawImage($img,$frame1); //inhoud van $frame1 naar $img schrijven
MagickSetImageDelay($img, 50); //pauze van een halve sec

MagickNewImage($img,250,250,"#FFFFFF");

$frame2 = NewDrawingWand();
DrawAnnotation($frame2,50,50,"Frame 2");
MagickSetImageDelay($img, 50); //pauze van een halve sec

MagickDrawImage($img,$frame2); //inhoud van $frame2 naar $img schrijven

MagickSetFormat($img, "GIF"); //zorg voor het juiste formaat
header("Content-Type: image/gif"); //zorg voor de juiste headers
MagickEchoImagesBlob($img); //output het geheel
?>


MagickNewImage does the trick, eigenlijk best logisch.

:) Ik raad serieus iedereen aan om MagickWand te gebruiken, op zich best wel luxe als je van de GD lib afkomt :D.

[ Voor 3% gewijzigd door mcdronkz op 06-09-2006 14:10 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Best toevallig dat ik hier net ook mee bezig ben, maar bij mij werkt jouw code in ieder geval niet. Op die manier krijg ik 1 leeg frame, en 1 frame waar zowel 'Frame 1' als 'Frame 2' op staat.

Om het even wat duidelijker te illustreren heb ik je code iets aangepast, maar in principe is hij nog altijd hetzelfde, op achtergrondkleur, positie van de text en grootte na:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
$img = NewMagickWand();
MagickNewImage($img,100,100,"#FFAAFF"); // = roze

$frame1 = NewDrawingWand();
DrawAnnotation($frame1,10,20,"Frame 1");

MagickDrawImage($img,$frame1); //inhoud van $frame1 naar $img schrijven
MagickSetImageDelay($img, 50); //pauze van een halve sec

MagickNewImage($img,100,100,"#AAFFAA"); // = lichtgroen

$frame2 = NewDrawingWand();
DrawAnnotation($frame2,20,40,"Frame 2");
MagickSetImageDelay($img, 50); //pauze van een halve sec

MagickDrawImage($img,$frame2); //inhoud van $frame2 naar $img schrijven

MagickSetFormat($img, "GIF"); //zorg voor het juiste formaat
header("Content-Type: image/gif"); //zorg voor de juiste headers
MagickEchoImagesBlob($img); //output het geheel
?>


Dit levert het volgende plaatje op (even opgeslagen als gif om serverload laag te houden): Afbeeldingslocatie: http://rotzooi.lakwijk.com/magickwand.gif

Zoals je ziet komt alles op het eerste frame terecht (die is immers roze), en bovendien wordt dit frame langer getoond dan het tweede, groene ('onterecht' lege) frame

-edit-
waar het dus op neer komt is dus dat op de een of andere manier, hij zich niets van de currently active image index lijkt aan te trekken - de DrawImage en SetImageDelay worden op het eerste frame ipv op het tweede uitgevoerd. Het gekke is dat als ik op de twee plaatsen in de code MagickGetImageIndex($img) laat echo'en, ik wel gewoon 0 en 1 krijg te zien :|

[ Voor 11% gewijzigd door Verwijderd op 08-09-2006 19:38 ]


Acties:
  • 0 Henk 'm!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 20-09 22:44

MBV

bij de 2e staat je SetImageDelay op een relatief andere plek, die moet regeltje wisselen met zijn onderbuur gok ik. Of je moet dat erboven doen :)

Interessante library trouwens, kon best wel eens veel command-line gepruts schelen :)

[ Voor 6% gewijzigd door MBV op 08-09-2006 23:38 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Mja, dat zou geen zak uit moeten maken natuurlijk (en dat doet het ook niet, net even getest); De code hierboven maakt steeds een frame aan, en doet er dan wat mee (delay setten en erop tekenen). In welke volgorde dat 'er wat mee doen' gebeurt zou niets uit moeten maken. Ondertussen heb ik overigens nog steeds geen oplossing gevonden en ben ik nog steeds even ver :/

Acties:
  • 0 Henk 'm!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 20-09 22:44

MBV

sorry, 't was een suggestie. DrawImage is toch het toevoegen van het huidige frame aan het 'totaalplaatje'? Dan zou het dus best wel eens wat kunnen uitmaken.

Misschien helpt het om te zoeken op coalesce? Dat was iig wat ik tegenkwam bij de 'convert'-examples.
Even verder zoeken levert de functie MagickCoalesceImages op, misschien kan je daar wat mee :)

Acties:
  • 0 Henk 'm!

  • mcdronkz
  • Registratie: Oktober 2003
  • Laatst online: 16-04 12:44
Hmm, ik voer EXACT dezelfde code als jou uit:

Afbeeldingslocatie: http://mcdronkz.ath.cx:1337/gaar.php

Wazige shit !

Acties:
  • 0 Henk 'm!

Verwijderd

Waarom gebruik je phpanigif niet? Deze kan je vinden op deze website. Hiermee kan je perfect Gifjes maken, ongeacht de PHP versie die je draait.
Pagina: 1