在iOS Safari中缩放和绘制图像到画布时,宽度是正确的,但高度被压扁了
When scaling and drawing an image to canvas in iOS Safari, width is correct but height is squished
我正在加载图像,然后将该图像绘制到画布上。我还缩小了图像以适合画布。当我这样做时,图像以适当的宽度绘制到画布上,但高度约为画布实际高度的1/4。
//Calculate height from canvas-to-image width ratio
var width = canvas.width;
var height = ( width / img.width ) * img.height;
//Draw scale image (This results in a squished height, despite "height" being correct)
context.drawImage( image, 0, 0, img.width, img.height, 0, 0, width, height );
即使height
是正确的(在控制台检查),图像绘制到画布的高度要小得多。
此外,当我检查canvas.width / canvas.height
与img.width / img.height
的比例时,我得到:.707234
vs .707818
.这是如此接近,它不能解释巨大的高度问题。
为什么会发生这种情况?我该如何解决这个问题?
EDIT:在Chrome上,这个确切的代码显示正确。
var ratio = (width/img。宽度)*图像宽度;将使比率等于宽度,没有从img中学到任何东西。宽度,因为你是用相同的值相乘来撤销除法。这将打乱你的高度计算,从而打乱绘制的图像。
试着这样写:
var ratio = ( width / img.width );
你会得到画布和图像高度之间的真实比例。但我认为你无论如何也不想那样。
你想要的是保持你的图像的长宽比(宽度/高度)相同,并缩小它以适应。这是可能的,即使画布有不同的长宽比,在两侧或顶部和底部留下未使用的空间。
所以你真正需要知道的是你应该用哪个来缩放你的图像。宽度或高度。
如果图像的宽高比大于画布,则使用宽度缩放。这意味着使宽度相同,并将高度设置为保留图像的长宽比的任何值。这将在顶部和/或底部留下空白。
如果图像的宽高比低于画布,则使用高度缩放。等等,高度不变。规模的宽度。两边都是空白。
var imgRatio = img.width / img.height;
var canRatio = canvas.width / canvas.height;
var scaledWidth = img.width * (canvas.height / img.height);
var scaledHeight = img.height * (canvas.width / img.height);
if (imgRatio > canRatio) {
context.drawImage( image, 0, 0, canvas.width, scaledHeight );
} else {
context.drawImage( image, 0, 0, scaledWidth, canvas.height );
}
如果你没有对图像进行任何剪辑,只是缩放,那么这些参数就是你所需要的。
http://www.w3schools.com/tags/canvas_drawimage.asp这是iOS Safari中的一个bug。说明如下:Mobile Safari渲染在画布上缩放?
解决方案在这里:https://github.com/stomita/ios-imagefile-megapixel
如果你有一个非常高分辨率的图像(大于1024x1024),它将被抽样(减少16倍的像素数)。当这样做时,Safari会引入一个错误,导致垂直高度过小。
<<p> 解决方案/strong>要解决这个问题,需要取图像的一小块(比如从文件中读取到缓冲区中的块),调整垂直高度差,将它们绘制到临时画布上,然后将临时画布的像素绘制到目标画布上。
- 调整缩放窗口高度提升缩放
- 自动缩放图像以匹配文本高度
- 当只给定宽度或高度时,是否所有浏览器都按比例缩放图像
- 如何计算缩放后画布的新高度和宽度
- 量角器获取元素的比例或缩放的宽度和高度
- 根据浏览器的宽度/高度在页面上进行自动缩放,就像 Firefox 所做的 CTR+- 一样
- 使用 Java 脚本获取图像的缩放宽度和高度
- 根据宽度或高度的最高值缩放图像固定量
- 获取缩放变换元素的实际高度
- 带有viewBox和width的SVG在IE中未正确缩放高度
- D3使用滚动条进行缩放,滚动条宽度和高度可根据缩放比例进行调整
- 使用CSS3缩放后,获得元素的实际宽度和高度
- 我每隔几秒钟就会改变图像,同时也会以100%的高度和宽度响应缩放图像
- FabricJS toDataURL倍增器没有返回正确的高度/缩放正确
- 变换(缩放)与简单的宽度/高度和左/顶部位置
- 获得缩放图像的高度
- SVG高度缩放不符合预期
- 基本Js函数缩放两个DIV's高度
- 如何缩放适合高度固定大小的孩子在屏幕css只允许javascript
- Jquery where's我的错误使用.css()缩放最小高度到窗口高度