[PHP] Imagick syntax onder Windows?*

Pagina: 1
Acties:
  • 121 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • js303
  • Registratie: April 2003
  • Laatst online: 01-06 10:17
hoi allen,

ik probeer php_imagick.dll op WinME aan de praat te krijgen.

ik heb ImageMagick-5.5.7-Q8 samen met GhostScript8.00 geinstalleerd, naast Apache 1.3.27 en PHP 4.3.0 . ik heb php_imagick.dll geplaatst in m'n php extensions map en de php.ini aangepast (extension=php_imagick.dll).

Als ik Apache start, krijg ik de error "a device attached to the system is not functioning." ... aha...!?

er is verdomd weinig documentatie hierover te vinden. een complete instructie hoe je imagemagick en php tezamen draaiende moet krijgen is er gewoonweg niet, of ik kijk met m'n neus.

is er iemand die imagemagick / de php_imagick.dll library wel aan de praat krijgt?

thanks.

edit - ik weet niet of dit de juiste categorie is. het gaat hier om installatie maar misschien ook om configuratie van php. dus aangezien het met php te maken heeft heb ik het maar hier in geplaatst...

[ Voor 15% gewijzigd door js303 op 21-07-2003 18:55 ]


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 22:43
Als het goed is heet Apache niet zoveel met PHP te maken, al kan ik me voorstellen dat de PHP module foutmeldingen in de Apache logs plaatst. Werkt de command line interface wel? (Zo ja, kun je dan ook ImageMagick functies gebruiken?)

Als dit wel werkt, is je Apache installatie een probleem (en dan zou de fout ook zonder het laden van de PHP module op moeten treden), zoniet, dan kun je het beste eerste de fout in PHP oplossen door te testen met de command line interface. Werkt dat goed, dan zou Apache ook weer moeten werken.

Acties:
  • 0 Henk 'm!

  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

js303 schreef op 21 juli 2003 @ 18:53:
edit - ik weet niet of dit de juiste categorie is. het gaat hier om installatie maar misschien ook om configuratie van php. dus aangezien het met php te maken heeft heb ik het maar hier in geplaatst...
Volgens mij is het formeel [SA], maar ik kijk 'em wel ff aan of ie hier goed wil lopen.
Verplaatsen kan altijd nog :)

Who is John Galt?


Acties:
  • 0 Henk 'm!

  • js303
  • Registratie: April 2003
  • Laatst online: 01-06 10:17
Werkt de command line interface wel? (Zo ja, kun je dan ook ImageMagick functies gebruiken?)
Ik heb de test die in de ImageMagick documentatie staat geprobeerd en dit werkt:
Select “Command Prompt” from the Windows Start menu. Within the window type
convert logo: logo.miff
imdisplay logo.miff
and the ImageMagick logo should be displayed in a window.
Als ik in m'n php.ini de regel "extension=php_imagick.dll" weer weghaal / remark, dan start apache met php weer gewoon op. Ik heb al gelezen dat php_imagick.dll de CORE dlls van imagemagick nodig heeft en dat die in de juiste map moeten staan. ik heb deze gekopieerd naar m'n system dir en naar php/extensions maar zonder enig effect.
Als dit wel werkt, is je Apache installatie een probleem (en dan zou de fout ook zonder het laden van de PHP module op moeten treden), zoniet, dan kun je het beste eerste de fout in PHP oplossen door te testen met de command line interface. Werkt dat goed, dan zou Apache ook weer moeten werken
maar als ik de php module niet inlaadt, dan laadt-ie toch uberhaupt ook imagick niet in? dus dan kan ik verder weinig testen. wat bedoel je precies met de cli - wat moet ik daar in proberen? imagemagick werkt iig..

Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 22:43
js303 schreef op 21 juli 2003 @ 19:10:
maar als ik de php module niet inlaadt, dan laadt-ie toch uberhaupt ook imagick niet in? dus dan kan ik verder weinig testen. wat bedoel je precies met de cli - wat moet ik daar in proberen? imagemagick werkt iig..
Ik wilde weten waar de fout nu precies zit. Werkt ImageMagick vanuit PHP als je de command line interface gebruikt? (Dat is me niet geheel duidelijk uit je post, namelijk.) Werkt Apache zonder PHP module wel goed?

Acties:
  • 0 Henk 'm!

  • js303
  • Registratie: April 2003
  • Laatst online: 01-06 10:17
ik heb geen ervaring met het runnen van php vanuit een cli - ik heb het nog nooit nodig gehad dus ik ben een leek op dat gebied. waarschijnlijk bedoel je dan php als een cgi draaien ipv een apache module? iig weet ik niet wat ik zou moet intikken.

apache draait goed ZONDER php module, tevens draait apache goed MET php module, zodra ik de imageick.dll weglaat.

Acties:
  • 0 Henk 'm!

  • js303
  • Registratie: April 2003
  • Laatst online: 01-06 10:17
aha ik snap nu wat je bedoelt met php vanuit cli: die geeft dus dezelfde foutmelding (php.exe):
PHP Warning: Unknown(): Unable to load dynamic library 'C:\Program Files\PHP\php_imagick.dll' - A device attached to the system is not functioning. in Unknown on line 0
het lijkt er dus op dat php niet wil.

[ Voor 9% gewijzigd door js303 op 21-07-2003 19:55 ]


Acties:
  • 0 Henk 'm!

  • js303
  • Registratie: April 2003
  • Laatst online: 01-06 10:17
weer een stapje verder gekomen. ik heb nu op aanraden van http://blog.bitflux.ch/p918.html de dll's van graphicsmagick gepakt en in m'n windows/system dir gezet. nu doet php het wel, geen foutmeldingen meer... echter zodra ik phpinfo() gaat php_imageick.dll over zijn nek en wordt apache weer gesloten... ut voelt allemaal zo buggy en onstabiel als een ouwe fiets...

Acties:
  • 0 Henk 'm!

  • js303
  • Registratie: April 2003
  • Laatst online: 01-06 10:17
YO ik heb hem aan de praat. Wat ik gedaan heb:

- GraphicsMagick-1.0.2-Q8-windows-dll.exe gedownload en geinstalleerd
- Aan m'n Autoexec.bat de volgende regel toegevoegd:

code:
1
SET PATH=C:\WINDOWS;C:\WINDOWS\COMMAND;c:\progra~1\GraphicsMagick-1.0.2-Q8


- Alle CORE_RL_* dll's evenals de X11.dll en de Xext.dll naar de windows system map gekopieerd (c:\windows\system)

- in PHP.ini de volgende regel toegevoegd:
code:
1
extension=php_imagick.dll

- de file http://php.chregu.tv/php_imagick.dll gedownload en in de php/extensions map geplaatst (dit path specificeer je in PHP.ini

- opnieuw opstarten en apache met php starten
- mbv phpinfo() kun je vervolgens zien of ImageMagick werkt. Je ziet dan een tabel met alle settings...

Nu moet ik nog even een scriptje testen, ik houd jullie op de hoogte.

Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 22:43
Leuk om te horen dat je er zelf uit komt! Ik wil je trouwens nog even wijzen op de mogelijkheid om je bericht te wijzigen (met dit knopje: Afbeeldingslocatie: http://gathering.tweakers.net/global/templates/got/images/icons/edit.gif); dat houdt de thread wat overzichtelijker (al kan ik me voorstellen dat je voor aparte onderwerpen aparte reacties plaatst).

Acties:
  • 0 Henk 'm!

  • js303
  • Registratie: April 2003
  • Laatst online: 01-06 10:17
OK, zal ik in het vervolg doen. ik zal binnenkort nog even een voorbeeld php scriptje erbij zetten waarmee je een EPS mbv php en ImageMagick kan inladen en herschalen.

Acties:
  • 0 Henk 'm!

  • PromWarMachine
  • Registratie: Oktober 2001
  • Laatst online: 19-09 22:28

PromWarMachine

Forsaken Archer

js303 schreef op 22 juli 2003 @ 14:30:
OK, zal ik in het vervolg doen. ik zal binnenkort nog even een voorbeeld php scriptje erbij zetten waarmee je een EPS mbv php en ImageMagick kan inladen en herschalen.
Komt dat scriptje nog? Normaliter zou ik dat op MSN/ICQ vragen, maar er staat geen info in je profiel.

Met je bovenstaande omschrijving heb ik het nu (ook in Windows) aan de praat gekregen, nu nog weten hoe ik het moet gebruiken. De documentatie richt zich vooral op de unix-installatie en werking. Ze gaan daar uit van een command prompt. Ik wil de functie convert (of een andere waar ik mee kan resizen) ook gaan gebruiken, maar er is geen direct bestand aan te wijzen waar ik in m'n script naar zou moeten verwijzen.

Zowel Google als de bruikbare topics die ik vond, richten zich op de unix/linux variant.

/usr/bin/convert is nogal simpel, maar bij Windows werkt 't toch iets andres.

De module is in ieder geval goed geladen:
Afbeeldingslocatie: http://www.tweakers.net/ext/f/23468/full.jpg

Iemand een werkend voorbeelscript of syntax voor onder Windows?

PHP:
1
2
3
4
//deze code heb ik geprobeerd:
$mogpath="E:/Program%20Files/Apache%20Group/Apache/htdocs/ImageMagick-5.5.7/utilities/mogrify.1";
$command="$mogpath -size $size files/$image_naam -resize $size +profile \"*\"";
exec($command);


De variabelen staan goed, die heb ik met echo gecontroleerd.

[ Voor 13% gewijzigd door PromWarMachine op 10-02-2004 17:50 ]

Dividend for Starters


Acties:
  • 0 Henk 'm!

  • Anders
  • Registratie: December 2000
  • Laatst online: 13-09 18:52
- belangrijke edit, daarom bovenaan -

Ik heb veel problemen ondervonden met spaties in padnamen onder Windows. Als je het na veel gehannes nog niet voor elkaar krijgt, overweeg dan om de boel over te zetten of desnoods te herinstalleren op een locatie waarbij je geen spaties (zoals in "Program Files") in je paden hoeft te gebruiken onder Windows.

- eind edit -

Ah! ImageMagick! Eindelijk, hoor je veel te weinig over.

Ik ontwikkel thuis op een Windows-omgeving en migreer de sites bij het live zetten naar een Unix-omgeving. Als je de locaties goed hebt, kom ik daarbij eigenlijk alleen problemen tegen bij het plaatsen van quotes om kleuren-definities. Dat heb ik met een eigen functie ondervangen. Hieronder wat snippets code die ik toepas om on-the-fly (doch eenmalig) een tekstuele header vervaardig van een string:

Afbeeldingslocatie: http://www.arcn.info/getimage.php?t=h&d=a&id=6


PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
switch($_SERVER["HTTP_HOST"]) {
  case "localhost":
    define("THE_PATH", "E:\\public\\domain\\u\\");
    define("TEMPLATE_PATH", "E:\\public\\domain\\images\\templates\\");
    define("SHORT_PATH", "/u/");
    define("IM_PATH", "E:\\bin\\im\\");

    // Geen quotes gebruiken bij imageMagick-kleuren op Windows:
    define("ADD_IM_QUOTES", false); 

    break;
  case "www.domain.com":
    define("THE_PATH", "/www/domain/dynimg/");
    define("TEMPLATE_PATH", "/www/domain/images/templates/");
    define("SHORT_PATH", "/dynimg/");
    define("IM_PATH", "/usr/bin/");

    // Quotes gebruiken bij imageMagick-kleuren op Linux
    define("ADD_IM_QUOTES", true); 

    break;
  default:
    echo("Server unknown");
    exit;
}


function imcolor($color) {
    if(ADD_IM_QUOTES) {
        return "'" . $color . "'";
    } else {
        return $color;
    }
}

$filename = "dynimage_a_t_" . $_GET["id"] . ".gif";
define("THE_FILE", THE_PATH . $filename);

$inputfile = TEMPLATE_PATH . "header_template.gif";
$tempfile = THE_PATH . "temp.tga";
$outputfile = THE_FILE;
$font = TEMPLATE_PATH . "LTe52467.ttf";
if (file_exists($outputfile)) unlink($outputfile);

$str= IM_PATH . "convert -fill " . imcolor("#806517") . " -pointsize 60 ";
$str .= " -gravity west -font $font -draw \"text 1,-9 '$text'\" $inputfile $tempfile";
$a=`$str`;

$str= IM_PATH . "convert -fill " . imcolor("#FBC82D") . " -pointsize 60 ";
$str .= "-gravity west -font $font -draw \"text 0, -10 '$text'\" $tempfile $tempfile";
$a=`$str`;

$str= IM_PATH . "convert +profile \"*\" -quality 97 -geometry 360x30 ";
$str .= "-colors 32 -despeckle $tempfile $outputfile";
$a=`$str`;

@unlink($tempfile);
if (file_exists(THE_FILE)) {
  $fp=fopen(THE_FILE, "rb");
  header( "Content-type: image/gif\nContent-Disposition: inline;" .
  "filename=\"header.gif\"\n" . 
  "Content-length: ".(string)(filesize(THE_FILE)) );
  fpassthru($fp);
}


Ik gebruik hier PHP-backticks om Imagemagick comand-line aan te sturen.

Elders gebruik ik de volgende code voor het resizen van afbeeldingen (even zonder verder commentaar):

PHP:
1
2
3
4
5
6
7
$str = IM_PATH . "convert +profile \"*\" -crop ". 
round($imageW*$resizefactor) . "x" . round($imageH*$resizefactor) . "+" . 
round($imageX*$resizefactor) . "+" . round($imageY*$resizefactor) . 
" -quality 80 -geometry 432x324  $inputfile $outputpreview";
echo("<P>" . $_POST["imageX"] . " - " . $imageX);
echo("<P>" . $str);
system($str, $result);


Hier gebruik ik dan weer system, maar goed, dit komt uit het CMS.

Overigens heb ik hier lokaal minixampp geïnstalleerd (Apache + PHP + MySQL + Perl + hele mikmak) en daarbi gewoon de ImageMagick Windows binaries geïnstalleerd, zonder iets met DLL's of php.ini te hoeven doen.

[ Voor 44% gewijzigd door Anders op 10-02-2004 22:57 ]

Ik spoor veilig of ik spoor niet.


Acties:
  • 0 Henk 'm!

  • PromWarMachine
  • Registratie: Oktober 2001
  • Laatst online: 19-09 22:28

PromWarMachine

Forsaken Archer

Die spaties vormden inderdaad een probleem. Heb de directories op een gegeven moment allemaal hard in de source gezet en toen quotes er omheen. Ook heb ik het met %20 geprobeerd, maar tussen dubbele quotes vond ik zelf handiger.

Daarna probeerde ik mijn commando uit te voeren. De exec($command) gaf echter nog steeds geen resultaat. Het was niet leuk meer. Toen ik $command op het scherm echo-de en deze complete opdrachtregel 1 op 1 in een batch-bestand zette en testte onder de windows prompt, werkte het perfect, aan de code was niets mis. Het lukte gewoon niet om het commando vanuit PHP uit te voeren. Daarna heb ik convert.exe gekopieerd naar de root van E: inclusief een bestand test.jpg. Daarmee geprobeerd te converten... Vanaf de 'dos' prompt: weer geen probleem. In PHP: Zelfde probleem. Hij slikte het gewoon niet.

Op een gegeven moment werd ik het zat en ging ik op zoek naar een alternatief, met native PHP commando's. Ik vond dit script en dat werkte direct, na een paar aanpassinkjes.

PHP:
1
2
3
4
5
6
7
8
9
10
function thumbs($file_name_src, $file_name_dest, $weight, $quality=100) { 
    $size = getimagesize($file_name_src); 
    $w = number_format($weight, 0, ',', ''); 
    $h = number_format(($size[1]/$size[0])*$weight,0,',',''); 
    $dest = imagecreatetruecolor($w, $h); 
    //imageantialias($dest, TRUE); 
    $src = imagecreatefromjpeg($file_name_src); 
    imagecopyresampled($dest, $src, 0, 0, 0, 0, $w, $h, $size[0], $size[1]); 
    imagejpeg($dest,$file_name_dest, $quality); 
}


Imageantialias heb ik op commentaar gezet, omdat deze uit GD komt, wat ik niet gebruik, bovendien is dit niet verplicht, zonder werkt het ook.

offtopic:
Toen ik dit werkend had, heb ik alle source die ik had over IMagick weggegooid, daar heb ik nu spijt van, anders had ik het kunnen laten zien, wat ik (verkeerd?) deed. Ook met control-z kon ik ze niet meer terugkrijgen, omdat ik daarna alweer veel tweaks had gedaan.


edit:

'k Heb 'm toch nog!
'k Had het zooitje natuurlijk nog in m'n batchbestand staan. :)


Dit werkte dus niet:
PHP:
1
2
3
4
$command = "E:/Program Files/ImageMagick-5.5.7-Q8/convert.exe" -resize 150x100
 "E:/Program Files/Apache Group/Apache/htdocs/gaby_website/files/bewijs.jpg"
"E:/Program Files/Apache Group/Apache/htdocs/gaby_website/files/bewijs.jpg";
exec($command);


De source is rood omdat ik -voor de leesbaarheid- twee ENTERS heb gegeven, maar je moet $command helemaal achter elkaar lezen. Dan vern$$k ik alleen nogal de lay-out. ;)

Dit werkte ook niet:
PHP:
1
2
$command = "E:/convert.exe -resize 150x100 E:/test.jpg E:/test.jpg";
exec($command) or die("werkt niet!");


*Hardop denkend* (achteraf)
Bij die eerste: Hmm... moet dat -resize niet tussen quotes? :X
Bij die tweede: Werkte convert.exe vanuit PHP wel als je hem gewoon verplaatst? ;(

@Anders Bedankt voor je source in ieder geval. Eigenlijk kan ik het niet uitstaan dat 't nog niet gelukt is met IM, dus morgen ga ik nog een poging wagen. Lukt het niet, dan gebruik ik gewoon m'n huidige oplossing, maar IM kan veel meer, mocht ik dat ooit nodig hebben... :)

[ Voor 35% gewijzigd door PromWarMachine op 11-02-2004 00:10 ]

Dividend for Starters


Acties:
  • 0 Henk 'm!

  • Anders
  • Registratie: December 2000
  • Laatst online: 13-09 18:52
Je zit er dicht bij, op het pad na. In Windows gebruik je dubbele backslashes. Ik heb net - met succes - het volgende uitgeprobeerd:

PHP:
1
2
3
4
5
6
if (file_exists("E:\\result.jpg")) unlink("E:\\result.jpg");

$command = "E:\\bin\\im\\convert.exe -resize 150x100 E:\\test.jpg E:\\result.jpg"; 
exec($command);

echo file_exists("E:\\result.jpg") ? "Het werkt wel" : "Het werkt niet";

Ik heb convert.exe hier in E:\bin\im staan, maar je snapt de bedoeling :)

Ik vertrouw overigens nooit op de return values van system(), exec() of soortgelijke functies, dat verschilt me teveel van machine tot machine.
Ik kijk achteraf of het bestand bestaat, zo ja, dan is het feest.


\edit

Nog iets, wat ik me net bedacht: in Windows 98 kon je op deze manier maximaal 255 karakters op een command-line geven. Gaf je er meer op dan las ie alleen de eerste 255 meen ik. Met afbeeldingen diep in subdirectories levert dat nogal eens problemen op. Windows XP kent deze beperking volgens mij niet, al moet ik zeggen dat ik de paden met mijn nieuwe installatie bewust erg kort gehouden heb dus misschien heb ik het gewoon nog niet meegemaakt.

\en nog maar een edit:

als ik convert.exe kopieer naar e:\ dan werkt ook de volgende regel:

PHP:
1
$command = "E:\\convert.exe -resize 150x100 E:\\test.jpg E:\\result.jpg";


Had ik niet vewacht :)

[ Voor 48% gewijzigd door Anders op 11-02-2004 01:32 ]

Ik spoor veilig of ik spoor niet.

Pagina: 1