Imagemagick maakt een bestand aan, kan er niks mee doen?

Pagina: 1
Acties:

Onderwerpen


  • AW_Bos
  • Registratie: April 2002
  • Laatst online: 01:32

AW_Bos

Liefhebber van nostalgie... 🕰️

Topicstarter
Hallo,

Ik had vandaag even zin om met ImageMagic te spelen via de commandline i.c.m PHP, en dat lukt aardig.
Echter stuit ik nu op iets wazigs...

code:
1
2
3
$command = "convert -size 320x100 xc:lightblue -font Candice -pointsize 72 \ -tile gradient:   -annotate +28+68 'Anthony' \ font_gradient.jpg"; 
system($command,$a);
echo "Result: ".$a;

Dit zou een plaatje moeten aanmaken zoals dit:
Afbeeldingslocatie: http://www.imagemagick.org/Usage/fonts/font_gradient.jpg

Echter wat er gebeurt is echt onbeschrijflijk voor mij in theorie?
Ik krijg een Result: 1 voor mijn neus. Lijkt wel goed te klinken?
En er worden twee images aangemaakt met de namen:

font_gradient-0.jpg
font_gradient-1.jpg

Maar met die bestanden kan ik helemaal niks, bij het openen geven ze een 404 - Not found, op de FTP kan ik ze niet verwijderen omdat ze niet bestaan, de UID en GID kloppen gewoon evenals de chmod die op 644 staat. Verwijderen kan wel vanuit de Direct Admin filemanager, maar vanwaar deze vage bestanden? Ik zou eerder een werkende 'font_gradient.jpg' verwachten?

Telecommunicatie van vroeger
🚅Alles over spoor en treintjes


Verwijderd

Ik krijg een Result: 1 voor mijn neus. Lijkt wel goed te klinken?
Dit klopt, $a geeft de status van de actie terug, dus 0 als het fout ging en 1 als het goed ging.

Hier is een voorbeeld dat wel zou moeten werken:
PHP:
1
2
3
4
5
6
7
8
$command = "convert -size 320x100 xc:lightblue -font Candice -pointsize 72 \ -tile gradient:   -annotate +28+68 'Anthony' \ font_gradient.jpg";
ob_start();
passthru($command, $result);
$content_grabbed=ob_get_contents();
ob_end_clean();

header('Content-Type: image/jpeg');
print $content_grabbed;

Dit zou de nieuwe afbeelding in de browser moeten tonen.

PS ik werk normaal met GD2, dus ik kan geen garantie geven dat het ook werkt omdat ik niet weet hoe IM in elkaar steekt...

  • AW_Bos
  • Registratie: April 2002
  • Laatst online: 01:32

AW_Bos

Liefhebber van nostalgie... 🕰️

Topicstarter
Het probleem blijft.
Ook als ik de code refactor naar:
PHP:
1
2
3
4
5
6
7
8
<?php
$command = "convert -size 320x100 xc:lightblue -font Candice -pointsize 72 \ -tile gradient:   -annotate +28+68 'Anthony' \ font_gradient.jpg";
passthru($command, $result);


header('Content-Type: image/jpeg');
print $result;
?>

Ik krijg uiteindelijk een 'dood' plaatje in FF4, die niet weergegeven kan worden, omdat hij een fout bevat. :/

Telecommunicatie van vroeger
🚅Alles over spoor en treintjes


  • DexterDee
  • Registratie: November 2004
  • Laatst online: 18:00

DexterDee

I doubt, therefore I might be

Die backslashes zijn definitief een onderdeel van je probleem. Ik heb je exacte scriptje zonder backslashes geprobeerd en krijg deze output:

Afbeeldingslocatie: http://213.179.198.2/font_gradient.jpg

Ik heb dat Candice font niet op mijn server staan, vandaar het afwijkende lettertype.

Mét backslashes krijg ik deze foutmeldingen:
convert: unable to open image ` -tile':  @ error/blob.c/OpenBlob/2587.
convert: no decode delegate for this image format ` -tile' @ error/constitute.c/ReadImage/532.

Volgens mij is je ImageMagick installatie niet helemaal lekker.

Laat je ImageMagick configuratie ut phpinfo() eens zien. Die van mij ziet er zo uit:
Afbeeldingslocatie: http://213.179.198.2/imagick.png

[ Voor 78% gewijzigd door DexterDee op 25-05-2011 12:46 ]

Klik hier om mij een DM te sturen • 3245 WP op ZW


  • AW_Bos
  • Registratie: April 2002
  • Laatst online: 01:32

AW_Bos

Liefhebber van nostalgie... 🕰️

Topicstarter
gedaan:
PHP:
1
2
3
<?php
$command = "convert -size 320x100 xc:lightblue -font Candice -pointsize 72  -tile gradient:   -annotate +28+68 'Anthony'  font_gradient.jpg";
// etc...

Probleem blijft...

Telecommunicatie van vroeger
🚅Alles over spoor en treintjes


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Waarom gebruik je de commandline en niet PHP's eigen interface?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • DexterDee
  • Registratie: November 2004
  • Laatst online: 18:00

DexterDee

I doubt, therefore I might be

Overigens, die twee tijdelijke bestanden die hij maakt zouden gewoon "valid" moeten zijn.

De output zoals op mijn server van de tijdelijke bestanden:

font_gradient-0.jpg:
Afbeeldingslocatie: http://213.179.198.2/font_gradient-0.jpg

font_gradient-1.jpg:
Afbeeldingslocatie: http://213.179.198.2/font_gradient-1.jpg

Het enige "opmerkelijke" is dat ImageMagick bij mij bij allebei deze bestanden een spatie voor de filename zet, waardoor de feitelijke naam op het filesystem " font_gradient-0.jpg" is. Wellicht dat daardoor wat verwarring ontstaat met het displayen van deze images.

Overigens, ...
Ik krijg een Result: 1 voor mijn neus. Lijkt wel goed te klinken?
Dit klopt, $a geeft de status van de actie terug, dus 0 als het fout ging en 1 als het goed ging.
Dit zijn beide foute statements. Het gaat hier om een exit code van een systeemcommando. Daar geldt dat alleen exitcode 0 als succesvol wordt gezien en alles != 0 is een foutcode.

Tenslotte sluit ik me ook aan bij NMe's opmerking, waarom niet gebruik maken van de imagick extensie in PHP? Dan voorkom je al deze commandline ellende.

[ Voor 20% gewijzigd door DexterDee op 25-05-2011 13:12 ]

Klik hier om mij een DM te sturen • 3245 WP op ZW


  • AW_Bos
  • Registratie: April 2002
  • Laatst online: 01:32

AW_Bos

Liefhebber van nostalgie... 🕰️

Topicstarter
NMe schreef op woensdag 25 mei 2011 @ 12:54:
Waarom gebruik je de commandline en niet PHP's eigen interface?
Gewoon om ermee te experimenteren. Als ik het in een project gebruik zal ik zeker dit vanuit de PHP interface gaan aanroepen. maar daarvoor moet ik wel eerst nog eventjes PHP hercompileren.

Telecommunicatie van vroeger
🚅Alles over spoor en treintjes


  • djexplo
  • Registratie: Oktober 2000
  • Laatst online: 27-10 15:31
code:
1
$command = "convert -size 320x100 xc:lightblue -font Candice -pointsize 72  -tile gradient:   -annotate +28+68 'Anthony'  font_gradient.jpg"

Als je code-debuged begin je altijd eerst met het reduceren van de code tot iets simpels. bijvoorbeeld:
code:
1
$command = "convert -size 320x100 -annotate +28+68 'Anthony'  font_gradient.jpg"

En voeg dna dingen als (het misschien wel ontbrekende) font etc.. weer toe

'if it looks like a duck, walks like a duck and quacks like a duck it's probably a duck'


  • AW_Bos
  • Registratie: April 2002
  • Laatst online: 01:32

AW_Bos

Liefhebber van nostalgie... 🕰️

Topicstarter
Aanhet reduceren ben ik ook al begonnen:
PHP:
1
2
3
4
5
6
<?php
$command = "convert -background lightblue label_file.gif";

system($command,$a);
  echo "Result: ".$a;
?>

Ik krijg dan Result 1.
En bovendien lijkt me dit ook geen lastige opdracht?
convert -background lightblue label_file.gif

[ Voor 4% gewijzigd door AW_Bos op 25-05-2011 13:37 ]

Telecommunicatie van vroeger
🚅Alles over spoor en treintjes


  • DexterDee
  • Registratie: November 2004
  • Laatst online: 18:00

DexterDee

I doubt, therefore I might be

AW_Bos schreef op woensdag 25 mei 2011 @ 13:15:
Gewoon om ermee te experimenteren. Als ik het in een project gebruik zal ik zeker dit vanuit de PHP interface gaan aanroepen. maar daarvoor moet ik wel eerst nog eventjes PHP hercompileren.
PHP hercompileren hoeft niet, je instaleert de imagick extensie via de package manager (php-imagick oid) of als deze er niet in zit, met pecl en zet de .so handmatig in de php ini met extension=imagick.so

Hoewel versimpelen van code om te debuggen altijd goed is, heb ik met mijn posts al aangetoond dat deze exacte scripts gewoon moeten werken. De fout zit 'm dus ergens in je ImageMagick installatie. Daar zou ik als eerste naar gaan kijken.

Roep dat convert statement eens gewoon op de commandline aan. Dan krijg je als het goed is een aantal foutmeldingen (anders zou je niet exit status 1 terug krijgen). Mocht dat niet genoeg informatie geven, geef dan de extra parameter -debug events mee, zodat je nog meer debug informatie krijgt. Pas als het op de commandline helemaal werkt, dan zou ik pas met een php script aan de slag gaan.

Klik hier om mij een DM te sturen • 3245 WP op ZW


  • AW_Bos
  • Registratie: April 2002
  • Laatst online: 01:32

AW_Bos

Liefhebber van nostalgie... 🕰️

Topicstarter
Thnx :).
Ik ga even Putty induiken. Ook zal ik die extention even installeren straks.

Telecommunicatie van vroeger
🚅Alles over spoor en treintjes


  • HuHu
  • Registratie: Maart 2005
  • Niet online
DexterDee schreef op woensdag 25 mei 2011 @ 13:00:
Overigens, die twee tijdelijke bestanden die hij maakt zouden gewoon "valid" moeten zijn.

De output zoals op mijn server van de tijdelijke bestanden:

font_gradient-0.jpg:
[afbeelding]

font_gradient-1.jpg:
[afbeelding]

Het enige "opmerkelijke" is dat ImageMagick bij mij bij allebei deze bestanden een spatie voor de filename zet, waardoor de feitelijke naam op het filesystem " font_gradient-0.jpg" is. Wellicht dat daardoor wat verwarring ontstaat met het displayen van deze images.
Dat komt omdat er ook een extra spatie voor de bestandsnaam in het commando staat.

Verwijderd

DexterDee schreef op woensdag 25 mei 2011 @ 13:00:
Overigens, ...

[...]

[...]

Dit zijn beide foute statements. Het gaat hier om een exit code van een systeemcommando. Daar geldt dat alleen exitcode 0 als succesvol wordt gezien en alles != 0 is een foutcode.
Je hebt gelijk, had het even verkeerd begrepen (php.net geeft hier ook geen uitleg over) en doe het zelf (in eigen applicatie) wel goed... DUs hoe ik die 2 nou kon omdraaien 8)7

Maargoed... als ik het zo even doorlees zitten er wel meerdere foutjes in de originele code, want het blijft status = 1 teruggeven. Dus er gaat al wat fout bij het converteren van de afbeelding. Ik zou daarom eerst kijken of het überhaupt werkt in de console en dan pas kijken of het probleem in PHP zit.

Het gebruik van de standaard PHP objecten is overigens wel handig, maar wordt dan ook alles ondersteund? Ik weet dat GD2 er standaard ingebakken zit, maar IM is alsnog los nodig om uit te voeren.
Pagina: 1