缩放SVG是模糊的或像素化的,不清晰
Zooming SVG is blury or pixelated, not sharp
我知道在某种程度上这是一个已知的问题,在这里已经被问到,但从来没有回答过,但我希望一些额外的见解。
我有一个简单的SVG图像在一个网页的div。我希望能够使用缩放手势缩放图像,并使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设置之后,但这是一个挑战,我不确定这是完成后,平移将正确工作。
刚刚尝试回答您的其他SVG问题,我将在这个问题上进行尝试。
Michael Mullany指出GPU翻译永远不会给你一个清晰的图像。这是因为GPU只是将一个像素数组映射到一个新的像素数组。因为它没有线或矩形的概念,所以分辨率是在GPU获得图像时设置的。CPU总是很难及时重新渲染以获得平滑的拖动。
是什么让一些浏览器产生一个清晰的图像,他们做了一些聪明的操作,比如渲染更多的像素,这样一些缩放可以在不损失分辨率的情况下发生。然而,这些是完全不一致的,不可能依赖。正如我所看到的"正确"解决方案是在缩放或缩放期间使用硬件加速转换进行翻译和缩放,然后在翻译完成时刷新没有css转换的视图框。需要克服的挑战是
- css转换将使用屏幕坐标,但viewBox操作将使用SVG坐标系统。
- 在屏幕tm和设备像素比中存在浏览器不一致
- 限制,以便人们不会拖拽或缩放太远需要在两个系统中计算
- 缩放中心点也需要在 中计算
- 为了进一步提高性能,css转换将被包装到requestAnimationFrame循环的更新中。
我的工作解决方案是锤头2。我首先关注的是台式机和安卓手机,这似乎对它们很有效。为了简化问题,缩放总是以屏幕中心为中心。然而,我做的事情这是目前唯一的解决方案之一。这里有一个有效的例子。
- 如何通过溢出来判断元素被切断了多少像素:隐藏在父级上
- 点击facebook像素跟踪注册(JS/JQUERY代码)
- 点击(右键点击)使用传单地图库获取图像覆盖的像素坐标
- 如何使线条的边缘像素保持半透明
- 画布:逐像素绘制图像并请求动画帧计时
- 如何's css标记"-webkit最小设备像素比”;在Javascript中实现
- javascript mootools平滑滚动'x'像素数量
- 逐像素碰撞检测弹球
- 获取图像的平均外部像素颜色
- 如何根据分辨率添加像素
- 仅当窗口宽度>940像素,无论是通过页面加载还是调整大小
- 使用画布在秒内逐像素显示图片
- JS/CSS:如何在向下滚动超过1200像素(高度)后更改z索引值
- 获取以屏幕像素为单位的旋转SVG元素的边界
- 如何将像素添加到元素的当前位置
- GridStack项的高度和宽度(以像素为单位)
- 在用户用动画滚动175像素后缩小固定的Div
- CSS将百分比转换为像素
- 滚动到..如何滚动到#上方一定数量的像素
- 缩放SVG是模糊的或像素化的,不清晰