2016-11-19 4 views
1

J'essaie de sauvegarder une image avec Imagick avec php. Quand j'appelle saveImage() ou saveImageFile() je reçoisImagick mémoire insuffisante (case 4) lors de la sauvegarde

Fatal error: Uncaught exception 'ImagickException' with message 'Insufficient memory (case 4)

L'image est d'environ 1Mo grand et le script peut utiliser 256 Mo de mémoire, que je pense devrait être suffisant. Il y a beaucoup d'espace disponible sur le disque.

Quel peut être le problème?

Le code est le suivant:

<?php 
list($type, $img) = explode(';', $img); 
list(, $img)  = explode(',', $img); 
$data = base64_decode($img); 
$image = new Imagick(); 
$image->readImageBlob($data); 
$image->setImageFormat("jpeg"); 
$image->setInterlaceScheme(Imagick::INTERLACE_PLANE); 
$image->writeImageFile(fopen($name.'-original.jpg','w')); 
?> 

Si je tente d'utiliser file_put_contents() au lieu de saveImage() un fichier vide est enregistré. Peut-être y a-t-il un problème avec la configuration du serveur?

+0

La mémoire référencée est RAM et non disque. Cela peut arriver en cas d'hébergement partagé. Si vous avez un serveur dédié, essayez d'effectuer des opérations de ce type en arrière-plan :) – georoot

+0

L'image @ raina77ow est au format JPEG. Le système est FreeBSD 8.3-RELEASE-p4 i386. PHP est PHP 5.6.16 – Rizhiy

+0

Avez-vous vérifié [cette astuce] (https://www.mediawiki.org/wiki/Manual:%24wgMaxShellMemory)? – raina77ow

Répondre

0

Le problème était avec $image->readImageBlob($data) même si c'était le retour du succès, l'image résultante était vide. Ce que je devinerais provoqué la division par zéro quelque part plus tard pendant la sauvegarde.

La solution je devait d'abord enregistrer les données dans un fichier, puis chargez-le dans:

list($type, $img) = explode(';', $img); 
list(, $img)  = explode(',', $img); 
list(,$type) = explode('/',$type); 
$data = base64_decode($img); 
file_put_contents($name,$data); 
$image = new Imagick($name); 

Bien que cela ajoute beaucoup de retard puisque nous devons passer par le disque, il est le meilleur que je pouvais penser.