2011-07-07 2 views
9
$image = "[...]"; //binary string containing PNG image 
$file = fopen('image.tmp', 'wb'); 
fputs($file, $image); 
fclose($file); 
$image = new Imagick('PNG:image.tmp'); 
$image->thumbnailImage($width, $height); 
$image->setImageFormat('jpg'); 
$image->setCompressionQuality(97); 
$image->writeImage('image.jpg'); 

Ce qui précède ne fonctionne pas et me donne une image noire pour this image. En faisant à la placephp imagick convertir PNG en jpg

[...] 
$image->setImageFormat('png'); 
$image->setCompressionQuality(97); 
$image->writeImage('image.png'); 

tout va bien à nouveau. Je pense qu'il doit faire quelque chose avec un fond transparent, qui n'est pas disponible au format JPG. Quelqu'un peut-il aider à résoudre ce problème (imagick n'est pas très documenté, donc je ne sais pas comment m'aider).

Répondre

15

trouvé une solution:

$white=new Imagick(); 
$white->newImage($width, $height, "white"); 
$white->compositeimage($image, Imagick::COMPOSITE_OVER, 0, 0); 
$white->setImageFormat('jpg'); 
$white->writeImage('image.jpg'); 
+2

Ceci est très utile lorsque vous traitez des fichiers PDF, puisque la méthode' flattenImages' réinitialise la page à la dernière ... Merci @rabudde! – Roberto

0

Essayez d'ajouter $image->setBackgroundColor(0xFFFFFF); après $image = new Imagick('PNG:image.tmp');

+0

'Erreur fatale PHP: exception non interceptée 'ImagickException' avec message ' Le paramètre '' invalide '', '#ffffff' à la place n'entraîne pas d'échec mais n'aide pas non plus. 'setImageBackgroundColor' ne fonctionne pas trop – rabudde

2

Vous pouvez utiliser setBackgroundColor pour définir la couleur d'arrière-plan par défaut à quelque chose d'autre que le noir. La transparence PNG sera remplacée par la couleur d'arrière-plan lors de l'enregistrement au format JPG.

Modifier: Utilisez-le comme suit:

$img->setBackgroundColor(new ImagickPixel('#FFFFFF')); 
+0

Voir ci-dessus commentaire, cela ne le résout pas :( – rabudde

+0

Vous devez passer un objet ImagickPixel, pas une chaîne de couleur si vous avez Imagick <= 2.1 Voir ma réponse éditée –

+0

I ' J'ai ajouté 'setBackgroundColor' juste après avoir appelé' new Imagick() '.Mais cela ne semble pas avoir d'effet.J'utilise PHP 5.3.6, ImageMagick 6.7.0, Imagick 3.1.0 – rabudde

5

Une autre façon de convertir png transparent en jpg, comme mentionné dans Imagick::flattenImages:

$im = new Imagick('image.png'); 
$im->setImageBackgroundColor('white'); 

$im->flattenImages(); // This does not do anything. 
$im = $im->flattenImages(); // Use this instead. 

$im->setImageFormat('jpg'); 
$im->writeImage('image.jpg'); 
+0

Merci beaucoup, ça a résolu mon problème :) – kailash19

+0

Beaucoup Merci pour ce message –