[PHP] Imagick - Unable to read image from the filehandle

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • BikkelZ
  • Registratie: Januari 2000
  • Laatst online: 21-02 08:50
Ik ben nu al geruime tijd bezig om met Imagick (Image Magick) wat dingen uit te proberen, en ik loop nu tegen iets aan wat voor mijn gevoel misschien helemaal niet meer aan de code ligt. Ik heb de volgende code geschreven:

PHP:
1
2
3
4
5
6
7
8
9
10
11
    // fopen a remote location
    $fp = fopen("http://localhost/imagick/images/renee.jpg", "r");
    //$fp = fopen("C:\\Websites\\xampp\\htdocs\\imagick\\images\\renee.jpg", "r");

    // create new imagick object
    $im = new Imagick();

    $im->readImageFile($fp);

    // pass the handle to imagick
    $im->pingImageFile($fp);


Ik krijg bij het uitvoeren van zowel het locale pad als de HTTP URL de zelfde melding: "Unable to read image from the filehandle". Als ik er op Google kom ik op een soort PECL bugtracker terecht die zegt dat het probleem begin dit jaar is opgelost in de source.

Als ik met Imagick bvb een checkerboard aanmaak en dan vervolgens allerlei distortions toepas doet hij het wel, dus het lijkt wel goed te werken verder. Moet ik iets anders doen dan fopen of?... :-(

iOS developer


Acties:
  • 0 Henk 'm!

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 09-07 15:06
Sowieso vergeet je aan fopen() mee te geven dat je in binary-mode wilt lezen. Dat is nogal relevant bij bestanden zoals afbeeldingen
PHP:
1
$fp = fopen("...", 'rb');


Voor de zekerheid zou je eerst nog met file_exists() kunnen checken of je het bestand daadwerkelijk kunt bereiken en dus of bijvoorbeeld de url_wrappers wel aanstaan. Zo niet zou fopen() daarvan wel een error moeten geven, maar ik weet niet of je display_errors aan hebt staan?
Al denk ik dat de binary-mode je probleem oplost, wat je overigens zo uit de comments in de documentatie had kunnen kopiëren.

[ Voor 22% gewijzigd door frickY op 26-09-2010 13:42 ]


Acties:
  • 0 Henk 'm!

  • BikkelZ
  • Registratie: Januari 2000
  • Laatst online: 21-02 08:50
Met file_exists krijg ik alleen bij het locale pad true terug hoewel het http pad wel klopt als ik het kopieer naar mijn browser. Het aanpassen naar "rb" verandert niets. Heb display_errors en error_reporting net als een try catch blok uit de listing gehaald.

Heb de laatste XAMPP voor Windows gedownload vrijdag en ook de laatste Image Magick binaries. Had al aardig wat voeten in de aarde om het werkend te krijgen..... :F

iOS developer


Acties:
  • 0 Henk 'm!

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 09-07 15:06
Als de file_exists() false geeft voor je url staan de url_wrappers waarschijnlijk uit. Je kunt de File-functions dan niet gebruiken voor remote bestanden.
Dat je hier geen error van ziet betekend dat error_reporting uit of te laag staat, of display_errors uit.
Zet die aan op je ontwikkelomgeving, anders blijf je zoeken.

Acties:
  • 0 Henk 'm!

  • BikkelZ
  • Registratie: Januari 2000
  • Laatst online: 21-02 08:50
Error settings bovenin deze file:

ini_set("display_errors","On");
error_reporting(E_ALL);

allow_url_fopen setting ga ik mee aan de slag, die heb ik in ieder geval nodig! :P

----

Hmm in php.ini stond deze regel al:

allow_url_fopen = On

En deze ook:

display_errors = On

[ Voor 23% gewijzigd door BikkelZ op 26-09-2010 14:29 ]

iOS developer


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Dan nog moet je bij alle system calls _altijd_ de return value checken. Oftewel, in deze code is (oa) een controle dat fopen() geen false terug geeft verplicht.

{signature}


Acties:
  • 0 Henk 'm!

  • BikkelZ
  • Registratie: Januari 2000
  • Laatst online: 21-02 08:50
Als ik hem dump zie ik "resource(3) of type (stream)", lijkt me correct?

iOS developer


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Dat is goed ja. Maar dan nog moet je gewoon altijd die check in de code hebben.

{signature}


Acties:
  • 0 Henk 'm!

  • BikkelZ
  • Registratie: Januari 2000
  • Laatst online: 21-02 08:50
Dit werkt gewoon, ik zie het plaatje gewoon verschijnen in de map:

PHP:
1
2
3
4
5
6
7
8
9
    $fLocation = "C:\\Websites\\xampp\\htdocs\\imagick\\images\\renee.jpg";
    $fSaveTo = "C:\\Websites\\xampp\\htdocs\\imagick\\images\\renee_saved.jpg";

    $handle = fopen($fLocation, "rb");
    $handleSave = fopen($fSaveTo, "w");

    $contents = fread($handle, filesize($fLocation));

    fwrite($handleSave, $contents);


Dus ik denk dat het probleem niet in het fopen gebeuren zit.

---------

Hoe weet ik zeker dat ik niet nog steeds met deze bug te maken heb? http://pecl.php.net/bugs/bug.php?id=16932

[ Voor 17% gewijzigd door BikkelZ op 26-09-2010 15:10 ]

iOS developer


Acties:
  • 0 Henk 'm!

  • RambOe
  • Registratie: Februari 2003
  • Laatst online: 17:12
Zo moet het volgens mij:

PHP:
1
2
3
4
    $image = 'jeafbeelding.png';
    $im = new Imagick();

    $im->readImage($image);


Zie deze tutorial voor meer info http://phpro.org/tutorials/Imagick.html.

[ Voor 22% gewijzigd door RambOe op 26-09-2010 15:12 ]


Acties:
  • 0 Henk 'm!

  • BikkelZ
  • Registratie: Januari 2000
  • Laatst online: 21-02 08:50
Hmmm als ik nog een simpeler voorbeeldje pak met ...

PHP:
1
$im = new Imagick("images/renee.jpg");


....dan klapt Apache er gewoon ineens uit :(

Ben ik de enige met zoveel gelazer met zo'n - in mijn ogen tenminste - standaard extensie van PHP? :?

iOS developer


Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 17:00

Matis

Rubber Rocket

Ik gebruik imagemagick nooit vanuit PHP. Ik genereer middels PHP een shell-bestand met daarin alle parameters en roep die dan vanuit PHP aan.
Het geheugengebruik van Imagemagick kan soms nogal uit de pan reizen en dan klapt apache er simpelweg uit :)

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

  • BikkelZ
  • Registratie: Januari 2000
  • Laatst online: 21-02 08:50
Ja ik krijg zelf ook wel een beetje het vermoeden dat het daar op neer gaat komen....in het verleden ook altijd gedaan voor simpelere bewerkingen..

Maar hoe zou je dan het volgende aanpakken: Ik moet een groot plaatje maken van allemaal plaatjes die op andere websites staan. Een beetje zoals zo'n Twitterachtergrondje wat je kunt maken van al je followers.

Leek me erg complex om via commandline te doen omdat ik dan steeds zoveel plaatjes zou moeten wegschrijven naar disk. Daarom leek het me nu wel erg makkelijk om het wat meer te integreren met mijn PHP code, ook met het oog op debuggen.

[ Voor 10% gewijzigd door BikkelZ op 26-09-2010 20:27 ]

iOS developer

Pagina: 1