【问题标题】:php imagick convert PNG to jpgphp imagick 将 PNG 转换为 jpg
【发布时间】:2011-09-30 10:39:37
【问题描述】:
$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');

上述方法不起作用,并为this 图像提供了黑色图像。当做而不是

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

一切又好了。我认为它必须做一些透明背景的事情,这在 JPG 格式中不可用。任何人都可以帮助解决这个问题(imagick 没有很好的记录,所以我不知道如何帮助自己)。

【问题讨论】:

    标签: php png jpeg imagick


    【解决方案1】:

    尝试在$image = new Imagick('PNG:image.tmp'); 之后添加$image->setBackgroundColor(0xFFFFFF);

    【讨论】:

    • PHP Fatal error: Uncaught exception 'ImagickException' with message 'Invalid parameter provided',使用 '#ffffff' 不会导致失败,但也无济于事。 setImageBackgroundColor 也不行
    【解决方案2】:

    您可以使用setBackgroundColor 将默认背景颜色设置为黑色以外的其他颜色。保存为 JPG 时,PNG 透明度将替换为背景颜色。

    编辑:像这样使用它:

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

    【讨论】:

    • 如果你有 Imagick
    • 我在调用new Imagick() 之后添加了setBackgroundColor。但这似乎没有任何效果。我正在使用 PHP 5.3.6、ImageMagick 6.7.0、Imagick 3.1.0。
    • 调用exec("convert png.png -resize 500x400 -background white -flatten png_small.jpg") 效果很好,但为什么不能在PHP 中使用$image->setBackgroundColor(new ImagickPixel('#FFFFFF'));$image->flattenImages();
    【解决方案3】:

    找到解决办法:

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

    【讨论】:

    • 这在处理 PDF 时也非常有用,因为 flattenImages 方法会将页面重置为最后一个...谢谢@rabudde!
    【解决方案4】:

    另一种将透明png转换为jpg的方法,如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');
    

    随着时间的推移,flattenImages() 已被弃用。
    而不是上面的行使用:

    $im->mergeImageLayers(Imagick::LAYERMETHOD_FLATTEN);
    

    【讨论】:

    • flattenImages 已弃用。
    猜你喜欢
    • 2012-09-13
    • 2018-05-28
    • 1970-01-01
    • 1970-01-01
    • 2012-02-06
    • 2013-07-07
    • 2017-07-26
    • 1970-01-01
    • 2017-06-11
    相关资源
    最近更新 更多