examples php imagick

examples - pdf to image php



Transparente a blanco en Imagick para PHP (10)

Con respecto al problema con segfault me ​​encontré con el mismo problema.
Aparentemente $image->writeImage(''somename'') destruye $image o la referencia a él.

Me estaba topando con el mismo problema. La forma en que lo manejé fue eliminando la llamada para destruir el objeto que había terminado de escribir. Parece descuidado pero eso solucionó el problema con el segfault

Tengo una imagen png con un fondo transparente y quiero convertirla en una imagen jpg con un fondo blanco.

El código es básicamente este:

$image = new Imagick(''transparent.png''); $image->writeImage(''opaque.jpg'');

Pero eso crea un jpg de fondo negro. He estado luchando con la peor documentación que he intentado encontrar una manera de convertir lo transparente a blanco sin resultado.

Edit : Bueno, probé la idea de Marc B y de alguna manera funcionó.

$image = new Imagick(''transparent.png''); $white = new Imagick(); $white->newImage($image->getImageWidth(), $image->getImageHeight(), "white"); $white->compositeimage($image, Imagick::COMPOSITE_OVER, 0, 0); $white->writeImage(''opaque.jpg''); $image->destroy(); $white->destroy();

El problema ahora es que siempre hace que el script se segfault.


Intenta lo siguiente, funciona para mí:

$im = new Imagick(''trans.png''); $im->setimagebackgroundcolor(''white''); $im = $im->flattenimages(); $im->writeimage(''transToWhite.jpg'');

¡Espero que ayude!


Me encontré con el mismo problema al convertir archivos PDF a PNG y usé flattenImages ().

//get the first page of the PDF $im = new imagick( $file.''[0]'' ); //set the background to white $im->setImageBackgroundColor(''white''); //flatten the image $im = $im->flattenImages(); //do the rest of the image operations $im->setResolution( 181, 181 ); $im->setCompressionQuality(100); $im->resizeImage ( 181, 181, imagick::FILTER_LANCZOS, 1, TRUE); $im->setImageFormat(''png''); $imageName = $title.''_thumb.png'';


Prueba este:

$white->newImage($image->getImageWidth(), $image->getImageHeight(), "transparent");


Puede probarlo cambiando la constante Imagick como se muestra a continuación

//$image will conatains image which needs background to be transparent $white = new Imagick(); $white->newImage($image->getImageWidth(), $image->getImageHeight(), new ImagickPixel( "white" )); $white->compositeimage($image, Imagick::COMPOSITE_DEFAULT, $x1OfTransparentImage, $y1OfTransparentImage,); $white->flattenImages(); $white->writeImage(''opaque.jpg''); $white->destroy();


Tratar:

$image = new Imagick(''transparent.png''); $image->setImageMatte(true); $image->setImageMatteColor(''white''); $image->setImageAlphaChannel(Imagick::ALPHACHANNEL_OPAQUE); $image->writeImage(''opaque.jpg'');


Tuve una situación en la que estaba tratando de reemplazar el fondo transparente con blanco (pero manténgalo como png). Probé varios métodos diferentes (incluido setImageAlphaChannel con setImageBackgroundColor). Combinando el uso de OP de compositeImage, se me ocurrió esto (espero que sea útil para otra persona):

$pic = new Imagick($filelocation); //specify file name $pic->setResourceLimit(6, 1); if ($pic->getImageAlphaChannel()) { $white = new Imagick(); $white->newImage($pic->getImageWidth(), $pic->getImageHeight(), "white"); $white->compositeImage($pic, Imagick::COMPOSITE_OVER, 0, 0); $pic = clone $white; $white->destroy(); $pic->mergeImageLayers(Imagick::LAYERMETHOD_FLATTEN); } //do more things with $pic


flattenImages() realmente funciona.

Pero tenga en cuenta que no modifica el objeto /Imagick() dado sino que devuelve uno nuevo :

$image = new /Imagick(''transparent.png''); // Need to use the result of $image->flattenImages() here! $image = $image->flattenImages(); $image->writeImage(''opaque.jpg'');

flattenImages() toma como valor predeterminado el color de fondo white . Si desea utilizar otro color de fondo, debe configurarlo antes de cargar la imagen:

$image = new /Imagick(); // Needs to be called before the image is loaded! $image->setbackgroundcolor(''green''); $image->readimage(''transparent.png''); $image = $image->flattenImages(); $image->writeImage(''opaque.jpg'');

En general, la API de Imagick es muy sensata cuando se trata del orden de las llamadas de funciones (como la convert y sus parámetros en la línea de comandos), así que siempre verifique si su orden es correcta.

¡Buena suerte!

Edición Abril 2016:

$image->flattenImages() está en desuso y debe reemplazarse por:

$image->mergeImageLayers(/Imagick::LAYERMETHOD_FLATTEN)

Es difícil encontrar información exacta sobre esto, pero parece que esto se aplica a PHP> = 5.6.

Gracias a vee por la punta!


Problema de Segfault: tuve un problema similar (el script seguía dándome segfault, incluso cuando la imagen se había procesado y escrito correctamente), la solución que encontré vino después de revisar los informes de errores, consulte: https://bugs.php.net/bug.php?id=61122

Sabiendo eso, intente agregar
$white->setResourceLimit(6, 1); // 6 means "limit threads to"
antes de la línea problemática (en mi caso tuve que ponerlo antes de $ im-> resizeImage (...);)


$image = new Imagick(''transparent.pdf''); $image->setImageType (imagick::IMGTYPE_TRUECOLOR); $image->writeImage(''opaque.tif'');

lo hice por mi

(en lugar del anteriormente imagick :: IMGTYPE_TRUECOLORMATTE)