缩放SVG模糊或像素化,不锐利

时间:2014-03-11 20:57:41

标签: javascript css svg touch hammer.js

vI在某种程度上知道这是一个已经被问到但已经没有回答的已知问题,但我希望能有一些额外的见解。

我在网页上的div中有一个简单的SVG图像。我希望能够使用捏合手势缩放图像并让SVG渲染得很清晰。在变焦过程中不需要锐利,但在手势完成后应该很清晰。

我在带有触摸显示器的Windows 8.1计算机上,在iPad上和旧的Android Galaxy Tab上进行测试。在主计算机上,我使用的是IE11和Chrome。为了处理触摸手势,我使用的是Hammer.js。我通过使用jQuery css()函数修改变换CSS来进行缩放(我设置了scale3d和translate3d)。

我电脑上的IE11完全像我想的那样工作。它在整个缩放变焦期间保持SVG图像清晰,无论我何时设置CSS,图像总是清晰的。

当我使用缩放缩放放大时,计算机上的Chrome始终会渲染SVG块。在变焦期间它是块状的,之后不会变得清晰。如果在加载页面(x13)后添加调用以缩放图像,则图像清晰。如果我使用setTimeout()调用来重置缩放,然后在缩放变焦结束后重新缩放图像,则图像会很清晰。

在iPad和Android平板电脑上,无论何时放大代码,SVG都不会急剧渲染。

有没有人知道如何在完成缩放变焦后可靠地结束SVG的清晰渲染?有没有人有更好的解决方案?在手势期间使用SVG viewBox进行缩放和平移不能为我们更复杂的SVG图像提供足够好的性能。我想在手势期间尝试使用硬件加速scale3d / translate3d,然后尝试将其转换为新的SVG viewBox设置,但这是一个挑战,我不确定平移后是否可以正常运行这个完成了。任何指针或想法都非常感谢。

1 个答案:

答案 0 :(得分:1)

刚刚尝试回答你的其他SVG Questio n我会尝试一下这个。

迈克尔·穆拉尼(Michael Mullany)认为,GPU翻译永远不会给你一个清晰的形象。这是因为GPU只是将一个像素阵列映射到一个新像素。因为它没有线条或矩形的概念,所以分辨率是由GPU获取图像的时间设置的。 CPU将始终难以及时重新渲染以实现平滑拖动。

允许某些浏览器生成清晰图像会发生什么,他们会进行巧妙的操作,比如渲染更多的像素,因此可以在不损失分辨率的情况下进行一些缩放。然而,这些完全不一致,不可能依赖。 我认为它的“正确”解决方案是在捏合或缩放期间使用硬件加速转换进行平移和缩放,然后在翻译完成时刷新视图框而不进行css转换。 需要克服的挑战是

  • css转换将使用屏幕坐标,但viewBox操作将使用SVG坐标系。
  • screenCTM和设备像素比率存在浏览器不一致
  • 限制,以便人们不会拖动或缩放太远需要在两个系统中计算
  • 还需要在
  • 中计算夹点中心点
  • 为了进一步提高性能,css转换将包含在requestAnimationFrame循环的更新中。

我的工作解决方案是hammerhead2。我首先专注于台式机和Android手机,它接缝为他们工作。为简化问题,缩放始终以屏幕中心为中心。然而,我确实这是目前唯一的解决方案之一。以下是working的示例。