2011-07-07 16 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'); 

Lo anterior no funciona y me da una imagen en negro para this imagen. Al hacerlo en su lugarphp imagick convertir PNG a jpg

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

todo está bien de nuevo. Creo que tiene que hacer algo con fondo transparente, que no está disponible en formato JPG. ¿Alguien puede ayudar a resolver esto (imagick no está documentado muy bien, así que no sé cómo ayudarme a mí mismo).

Respuesta

15

encontrado una solución:

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

Esto es muy útil cuando se trata de PDF también, ya que el método' flattenImages' restablece la página a la última ... Gracias @rabudde! – Roberto

0

Trate de añadir $image->setBackgroundColor(0xFFFFFF); después $image = new Imagick('PNG:image.tmp');

+0

'PHP Error fatal: excepción no detectada 'ImagickException' con mensaje ' El parámetro inválido provided'', usando '#ffffff' en cambio no da como resultado una falla pero tampoco ayuda. 'setImageBackgroundColor' no funciona demasiado – rabudde

2

Puede utilizar setBackgroundColor para establecer el color de fondo por defecto a otra cosa que no sea negro. La transparencia PNG se reemplazará por el color de fondo al guardar en JPG.

Editar: Se usa como tan:

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

Ver el comentario anterior, esto no lo resuelve :( – rabudde

+0

Debe pasar un objeto ImagickPixel, no una cadena de color si tiene Imagick <= 2.1. Consulte mi respuesta editada. –

+0

I ' he añadido 'setBackgroundColor' justo después de llamar' new Imagick() '. Pero eso no parece tener ningún efecto. Estoy usando PHP 5.3.6, ImageMagick 6.7.0, Imagick 3.1.0. – rabudde

5

Otra manera de convertir png transparente a jpg, como se menciona en 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

Muchas gracias, resolvió mi problema :) – kailash19

+0

Muchos Gracias por esta publicación –