【发布时间】:2019-04-27 10:48:06
【问题描述】:
最近在处理 Canvas 2D API 的 CanvasRenderingContext2D.drawImage() 方法时发现了这个错误
void ctx.drawImage(image, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight);
sx 和sy 参数应该是源的子矩形的左上角 的x-axis 和y-axis 坐标图像,以绘制到目标上下文中。 (来源:Mozilla)在 Safari 浏览器上提供的值小于 0(负值)时会有所不同。
sx 和 sy 的负值在其他浏览器(经过测试的 Chrome 和 Microsoft Edge)上按预期工作,方法是将提到的左上角沿负边重新定位x-axis 和 y-axis
但在 Safari 上,sx 和 sy 的负值会将左上角坐标重置为 0,0 并影响 源的子矩形的 RIGHT BOTTOM CORNER图片,绘制到目标上下文中。
这是附加的画布演示 sn-p 在 Chrome 和 Safari 上呈现的方式(轮廓是画布的边界):
const canvas = document.getElementById('canvas');
const ctx = canvas.getContext('2d');
const image = document.getElementById('source');
onload = e =>
ctx.drawImage(image, -40, -160, 300, 290, 0, 0, 300, 290);
canvas {
border: 1px solid black;
}
<canvas id="canvas" width="300" height="290"></canvas>
<div style="display:none;">
<img id="source" src="https://i.stack.imgur.com/NS35G.jpg">
</div>
任何解决此问题的方法肯定会有所帮助。
编辑:源宽度和源高度不超过实际图像的宽度或高度。
【问题讨论】:
-
凯多,不,不是。源宽度和源高度不超过实际图像的宽度或高度。
-
@Kaiido 另外,它没有回答我的问题。我需要这种特定行为(画布顶部和左侧的空白区域),这似乎适用于除 Safari 之外的所有浏览器。您应该删除这个可能的重复标志。
-
@saibbyweb 这与 Safari 的 drawImage 实现中的老错误相同。好的,您不会从与建议的欺骗相同的角度来看待它,但根本原因是完全相同的,解决方案也是如此:自己计算您需要的偏移量,以便您的源矩形完全在源图像中(即没有负 x 或 y 值)。在您的情况下,它将是
ctx.drawImage(image, 0, 0, 260, 130, 40, 160, 260, 130);。所以你是对的,你的源矩形不比源图像大,但正如在建议的欺骗中一样,它在外部并且正在选择不存在的像素。 -
这就是解决问题的方法。谢谢。标记为重复的问题并不能完全解决与我相同的问题。您在那里提到,由于某些特定标准,渲染失败,这显然不是这里的情况。我的
source height and widthimage height and image width + 你还声称...Safari has a bug where when you try to draw non-existent pixels (out of the boundaries or the source image), it will just fail.不,除非sx和sy的值为负数,否则它不会失败。对于正值来说很好。
标签: html canvas safari html5-canvas mobile-safari