[PHP] Image Magick

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Kan iemand even een voorbeeld geven hoe IM te gebruiken met PHP (via de command line)?

Ik heb zelf dit geprobeerd en dat werkte niet:

PHP:
1
2
3
exec("convert -rotate 90 test.jpg test.jpg", $iOutputImage);

imagejpeg($iOutputImage, 80);

Acties:
  • 0 Henk 'm!

Verwijderd

Klopt dat het niet werkt, exec() geeft als output alleen maar de berichten die ImageMagick op de commandline teruggeeft. Je zult hem dus met ImageMagick moeten converteren, wegschrijven in een ander bestand (of in hetzelfde bestand, wat je nu al doet, getuige je tweede test.jpg), en dat bestand vervolgens weer moeten uitlezen.

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Je voert een commando uit op de commandline. Je kunt nu eenmaal niet verwachten dat je dan ineens het plaatje in php krijgt. Om je voorbeeld werkend te krijgen zul je niet $iOutputImage moeten gebruiken, maar test.jpg inladen.

Ik raad je trouwens aan om hier een tijdelijke en unieke naam voor te gebruiken. Het zou namelijk mis kunnen gaan waneer 2 mensen zo'n bewerking tegelijk opvragen.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

Verwijderd

Wat Janoz zegt is inderdaad zinnig, tijdelijke bestandsnaam gebruiken (doe eens iets met uniqid(), of desnoods met een tabel met bestandsnamen erin en een daaraan gekoppeld auto_increment id). In elk geval moet je de functie imagecreatefromjpeg($bestandsnaam) gebruiken om je geconverteerde bestand weer in te lezen.

Acties:
  • 0 Henk 'm!

Verwijderd

Wat je ook eerst kan proberen is om het van de commandline te runnen en dan kijken of het werkt. Dus zonder PHP. Op zich is die exec() wel goed. Die gebruik ik ook altijd.

allebei test.jpg noemen moet ook geen problemen opleveren. Waar draai je IM onder? Onder windows of linux? Onder windows zou je de map waar "convert.exe" staat nog in het path moeten zetten.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik draai IM onder Linux.

Verder klopte mijn code achteraf wel, alleen had ik de chmod van de map vergeten te controleren. Deze stond nm. nog op 775 i.p.v. 777, dus daarom kon het bewerkte plaatje niet weggeschreven worden 8)7

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Nog iets anders; is het mogelijk om externe fonts te gebruiken? Dus dat je zeg maar het pad opgeeft bv. fonts/arial.ttf en dat het desbetreffende font dan beschikbaar komt binnen IM.

Na wat zoeken kwam ik alleen op het onderstaande voorbeeld uit (ik neem aan dat het font dat in deze query gespecificeerd staat, al geinstalleerd is op het OS (Linux)?

code:
1
2
3
convert -size 380x70 xc:lightblue -pointsize 50 -font Chisel \
             -fill green  -stroke black  -draw 'text 10,55 "Black Border"' \
             stroke_font.jpg

Acties:
  • 0 Henk 'm!

  • NaliXL
  • Registratie: Maart 2002
  • Laatst online: 13:18
Wat betreft je afbeelding in PHP krijgen : kun je Imagemagick een afbeelding niet naar standaard out laten sturen, en dat vervolgens direct opvangen met CreateImageFrom.... functie? Of kraam ik hier nu onzin uit?

Genoeg is meer dan veel, en tart den overvloed


Acties:
  • 0 Henk 'm!

Verwijderd

Of kraam ik hier nu onzin uit?
Yep! :)

Je zal het plaatje toch eerst op moeten slaan en vervolgens weer inlezen

Acties:
  • 0 Henk 'm!

  • NaliXL
  • Registratie: Maart 2002
  • Laatst online: 13:18
Sorry, ben hardnekkig figuur. Zou dit niet werken?
PHP:
1
$iOutputImage = system("convert -rotate 90 test.jpg -");

Genoeg is meer dan veel, en tart den overvloed


Acties:
  • 0 Henk 'm!

Verwijderd

Nee, je krijgt dan waarschijnlijk helemaal niets terug, of iets van een melding dat alles goed is gegaan (of juist niet)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb nu zowat een uur zitten kutten en ik krijg om de een of andere reden de volgende code niet werkend:
PHP:
1
exec("convert -rotate 90 input.jpg output.jpg");


Ik krijg verder ook geen foutmeldingen terug als ik het tweede argument meegeef, kortom ik kom er zelf niet meer uit :?

Zou er iemand dus even zo vriendelijk willen zijn om de bovenstaande code te testen met dit plaatje: http://www.adultmediashop...e_paradise/test/input.jpg, want dan weet ik tenminste zeker of het aan ImageMagick ligt of aan mijn code...

PS. Ik heb de CHMOD voor zowel de map waarin het script wordt uitgevoerd, als voor het script en het plaatje op 777 staan, dus daar kan het niet aan liggen neem ik aan...

Acties:
  • 0 Henk 'm!

Verwijderd

gebruik sowieso eens het path naar convert. En verder wat voor output krijg je momenteel? Code gebruiken via de commandline / shell werkt overigens hier perfect.

[ Voor 29% gewijzigd door Verwijderd op 11-01-2004 19:25 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Oh ik lees net iets over een z.g.n. safe-mode en dat je de exec dan alleen binnen in een gespecificeerde map kan aanroepen, dus ik denk dat dat mijn probleem is, want ik heb een tijdje terug aan mijn hosting-service gevraagd om 'register-globals' weer uit te zetten (en waarschijnlijk heeft dat te maken met de safe mode?).

Ik heb het verder ook even met shell_exec() geprobeerd en dat leverde ook geen output op, dus waarschijnlijk staat het systeem zo afgesteld dat het geen fouten terug geeft ofzo bij exec´s...

Maar bij jou werkte het code-voorbeeld dus wel?

Hoe maak ik trouwens een pad naar de convert? En volgens mij is dat niet nodig bij Linux machines? Ik heb de vorige keer althans ook geen pad naar de convert gebruikt en toen werkte de code ook :?

Kortom ik denk dat ik mijn hosting-service maar eens lastig ga vallen, want ik begin sterk de indruk te krijgen dat het aan de configuratie van de server ligt :)

[ Voor 11% gewijzigd door Verwijderd op 11-01-2004 20:59 ]


Acties:
  • 0 Henk 'm!

  • Tim
  • Registratie: Mei 2000
  • Laatst online: 04-08 16:29

Tim

probeer het eens het hele path voor image magick te gebruiken. Bij mij werken ook alleen de standaard shell commando's zonder path. Als ik bij de rest het path weglaat dan krijg ik gewoon niks, geen output, geen foutmeldingen..

Acties:
  • 0 Henk 'm!

  • Willem2
  • Registratie: Oktober 2000
  • Laatst online: 20-09 06:39

Willem2

Ω is futile

kijk eens in je error.log van apache?

Zou best wel eens een simpel rechten probleem kunnen zijn (heb ik zelf ook wel eens een uur lopen kloten met imagemagick voordat ik daarachter kwam...)

en nee, ik houd niet van voetbal... :)


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik moest inderdaad het pad meegeven. Wel vaag dat ik de functie eerst wel kon gebruiken zonder een pad te specificeren :? Ze zullen wel wat veranderd hebben op de server ofzo...

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
De simpele rotate-code (om te testen) werkt nu. Echter, de onderstaande code werk weer niet helemaal goed.

Als output krijg ik:

- Een JPEG met een blauwe achtergrong van 380 x 70 zonder tekst
- Geen foutmeldingen via de result-array

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$sPath = "/usr/local/bin/convert ";

$sQuery = "convert \
                -size 380x70 xc:lightblue \
                -pointsize 50 \
                -font arial.ttf \
             -fill green \
                -stroke black  -draw 'text 10,55 " . '"Black Border"' . "' stroke_font.jpg";

exec($sPath . $sQuery, $sResult);

foreach ($sResult as $iKey => $sValue)
{
    echo($iKey . " " . $sValue . "<br>");
}


Enig ID wat ik verkeerd doe?
Pagina: 1