svg - 当 devicePixelRatio !== 1 时将 SVG 下载为 PNG
问题描述
我想将 SVG 渲染为 PNG。
我通过将 SVG 写入画布并将画布下载为 PNG 来做到这一点。
在具有视网膜显示器和 devicePixelRatio !== 1 的设备上执行此操作时,会导致图像模糊。
当渲染到屏幕上时,这很容易通过通过属性放大画布然后通过 CSS 缩小画布来解决。
canvas.width = width * scale;
canvas.style.width = width;
但是,我想将画布下载为具有正确分辨率和大小的 PNG,我所能做的就是下载一个两倍于预期大小但在缩小时不模糊的 PNG,或者下载一个大小正确但模糊的 PNG。
这个Fiddle显示了问题,请注意您需要在 devicePixelRatio !== 1 的机器上(如 MacBook Pro 或 iMac)。
解决方案
我找到了解决办法。
图像只是模糊,因为它是渲染到屏幕上的光栅图像,图像中每 1 个像素有 4 个物理像素。这就是为什么您需要将画布放大 4 (2 x 2) 倍,然后再缩小。只有这样,画布才会包含每个物理像素的像素。
但是,然后下载该画布当然会产生两倍宽和两倍高的图像。这就是预期的结果!
我的问题源于我认为正确的图像尺寸可能看起来像像素化。
推荐阅读
- javascript - 提示计算方程在第一个输出上工作,但在第二个输出上用 number() 返回 NaN
- angular - 自定义验证指令Angular 6模板驱动表单的“无提供者”?
- javascript - 页面刷新Vue.js和axios后的空数组
- azure-storage - Azure 存储 CloudFile 自定义元数据 API,如 Azure 存储资源管理器
- sass - 为什么我们使用 #{} 进行插值?我们不能只使用 scss 变量吗?
- matlab - 为什么 GPU 上的隐式扩展并不总是更快?
- oracle - OracleDataReader GetValue 抛出 InvalidOperationException
- node.js - Tell ngix to send file from within node app with reverse proxy
- javascript - 为涉及 DataTypes.JSON 的序列化创建种子文件时出错
- python - 如何在 QScrollArea 中添加多个布局