在Imagick for PHP中透明到白色

fon*_*nso 19 php imagick

我有一个透明背景的png图像,我想将其转换为具有白色背景的jpg图像.

代码基本上是这样的:

$image = new Imagick('transparent.png');
$image->writeImage('opaque.jpg');
Run Code Online (Sandbox Code Playgroud)

但这会产生黑色背景jpg.我一直在努力寻找将透明转换为白色无效的最糟糕的文档.

编辑:嗯,我尝试了Marc B的想法并且有点工作.

$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();
Run Code Online (Sandbox Code Playgroud)

现在的问题是,它总是导致脚本出现段错误.

flu*_*flu 17

flattenImages() 实际上有效.

但请记住,它不会修改给定的\Imagick()对象,但会返回一个新对象:

$image = new \Imagick('transparent.png');

// Need to use the result of $image->flattenImages() here!
$image = $image->flattenImages();
$image->writeImage('opaque.jpg');
Run Code Online (Sandbox Code Playgroud)

flattenImages()默认为背景颜色white.如果要使用其他背景颜色,则必须加载图像之前进行设置:

$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');
Run Code Online (Sandbox Code Playgroud)

一般来说,当涉及到函数调用的顺序时,Imagick API 非常合理(就像convert它在命令行上的参数一样),所以请务必检查您的订单是否正确.

祝好运!

2016年4月编辑:

$image->flattenImages() 已被弃用,应替换为:

$image->mergeImageLayers(\Imagick::LAYERMETHOD_FLATTEN)
Run Code Online (Sandbox Code Playgroud)

很难找到关于此的确切信息,但似乎这适用于PHP> = 5.6.

感谢ve提示!

  • 现在,flattenImages() 已被弃用。使用 $image->mergeImageLayers(\Imagick::LAYERMETHOD_FLATTEN) 代替。 (2认同)

cha*_*aos 8

尝试:

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


gmj*_*dan 8

在将PDF转换为PNG时遇到了同样的问题,我使用了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';
Run Code Online (Sandbox Code Playgroud)


小智 5

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

为我做了!

(而不是以前的想象力:: IMGTYPE_TRUECOLORMATTE)