Symfony 带有alpha通道的Sonata媒体PNG压缩

Symfony 带有alpha通道的Sonata媒体PNG压缩,symfony,png,gd,sonata-media-bundle,Symfony,Png,Gd,Sonata Media Bundle,SonatamaDiabundle使用以下设置增加PNG图像大小: video_image: providers: - sonata.media.provider.image formats: medium: { width: 1306, quality: 100 } 原始图像大小为246Kb(宽度和高度相同),“调整大小”图像的大小为3Mb。这是因为质量:100设置了png\u压缩级别=>0 如果我设置质量:0,PNG大小几乎可以(图像看起来非

SonatamaDiabundle使用以下设置增加PNG图像大小:

video_image:
    providers:
        - sonata.media.provider.image
    formats:
        medium: { width: 1306, quality: 100 }
原始图像大小为246Kb(宽度和高度相同),“调整大小”图像的大小为3Mb。这是因为
质量:100
设置了
png\u压缩级别=>0

如果我设置
质量:0
,PNG大小几乎可以(图像看起来非常好),但JPG压缩使图像看起来像印象派

所以我用一个自定义的PNG图像大小调整器解决了这个问题

但是设置为
png\u compression\u level=>9时,压缩图像的大小仍然不理想,为664Kb

将PNG图像转换为PNG8解决了这个问题,大小变得非常正常-233Kb(甚至比原始图像更小),但我在alpha通道上遇到了一些问题

大多数具有透明度的图像压缩良好,但其中一些图像已损坏:

原始图像(透明背景上为白色)

压缩图像

这是我的自定义大小调整器(代码有点难看,因为它只是一个草稿):


所以我认为问题在于合成一些不完全透明的像素

我用GD函数尝试了不同的方法,但没有得到令人满意的结果

因此,我发现最好的方法是使用Imagick而不是GD:

services.yml:

    sonata.media.resizer.custom:
        class: AppBundle\Resizer\CustomResizer
        arguments: [@sonata.media.adapter.image.imagick, 'outbound', @sonata.media.metadata.proxy]
AppBundle\Resizer\CustomResizer:

<?php

namespace AppBundle\Resizer;

use Sonata\MediaBundle\Resizer\SimpleResizer;

class PngCustomResizer extends SimpleResizer
{
}

透明度将其隐藏,但看起来这些像素中毕竟有一些数据。如果你用一个完全透明的alpha来清空所有通道,那些下采样的人工制品就会消失。你(可能)可以调整你的代码来实现这一点,或者使用外部工具。你能澄清一下“如果你用完全透明的alpha清空所有通道”是什么意思吗?不确定我是否理解,请参见ImageMagick论坛上的讨论:以及此(也是ImageMagick)概述:。从这里开始:“PNG图像将保留完全透明像素的颜色。即使你看不到它的透明度有颜色,PNG保留该数据。”
    sonata.media.resizer.custom:
        class: AppBundle\Resizer\CustomResizer
        arguments: [@sonata.media.adapter.image.imagick, 'outbound', @sonata.media.metadata.proxy]
<?php

namespace AppBundle\Resizer;

use Sonata\MediaBundle\Resizer\SimpleResizer;

class PngCustomResizer extends SimpleResizer
{
}
sonata_media:
    providers:
        image:
            resizer: sonata.media.resizer.custom