我试图通过将透明 PNG 分解为彩色和 alpha 图像来减少它们的下载大小。这种方法效果很好,对于我客户的图像,尺寸减小了 50% 以上。
为了重新组合我正在尝试使用 SVG 和画布的图像。
SVG 解决方案使用不透明蒙版,而画布使用 globalCompositeOperation。
问题是,SVG 在缩小时会错误地显示暗边(通过在 CSS 中指定大小或直接在 SVG 上指定)。当以与输入图像相同的尺寸渲染 SVG 时,不会出现这些暗边。画布工作正常。这发生在我测试的所有浏览器(Chrome、IE11、Firefox)中
我认为的问题是 SVG 将独立调整 alpha 图像和彩色图像的大小,然后应用不透明蒙版。但是,这种方法不起作用。在图像处理中,众所周知,要调整透明图像的大小,要么必须将颜色分量与 alpha 相乘,然后使用标准的大小调整算法,要么必须执行加权平均(因为大多数透明像素具有对最终颜色的影响较小)。例如见这个讨论
应用 SVG 滤镜效果时,最初可以调整使用的中间分辨率,但我不知道在使用 SVG 蒙版属性时如何做到这一点(Robert Longson 正确地向我指出滤镜效果不支持这一点不再,因为该filterRes
属性已被弃用)
这是 SVG 代码(我们在任何兼容 HTML5 的浏览器中直接从我的网站运行它)
<svg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' width='1000' height='454' viewBox='0 0 2560 1162'>
<defs>
<mask id='mask'>
<image color-interpolation='sRGB' image-rendering='optimizeQuality' width='2560px' height='1162px' xlink:href='first-A.png'></image>
</mask>
</defs>
<image color-interpolation='sRGB' image-rendering='optimizeQuality' mask='url(#mask)' width='2560px' height='1162px' xlink:href='first-RGB.png'></image>
</svg>
有谁知道如何调整 SVG 蒙版效果以使这些边缘伪影不出现?
非常感谢,
彼得