画布中的 HTML5 图像适合问题

Posted

技术标签:

【中文标题】画布中的 HTML5 图像适合问题【英文标题】:HTML5 Image fit Issue in Canvas 【发布时间】:2014-09-11 13:37:43 【问题描述】:

我正在开发用于移动设备的 html5 应用程序。我正在使用画布元素和文件上传元素。 每当用户从移动设备点击此文件上传元素时。他看到了两种选择。 1.选择现有照片 2. 拍摄新照片

如果他选择现有照片,这将在我的画布中很好地修复,但如果他单击新照片,它不适合画布。宽度很好,但在画布中显示的点击图像高度不超过 50 像素。

我的 HTML 代码:

<canvas id="myCanvas"  ></canvas>
<input type="file" id="uploadImage" name="upload" value="Upload" onchange="PreviewImage();" />

我的 Javascript 代码

function PreviewImage() 
    var oFReader = new FileReader();
    oFReader.readAsDataURL(document.getElementById("uploadImage").files[0]);
    oFReader.onload = function (oFREvent) 
        var canvas = document.getElementById('myCanvas');
        ctx = canvas.getContext('2d');
        ctx.clearRect(0, 0, 270, 300);            
        imageUrl = oFREvent.target.result;
        var base_image = new Image();
        base_image.src = imageUrl;
        base_image.onload = function () 
        ctx.drawImage(base_image, 0, 0, 270, 300);
    
    ;

我搜索了许多网站,但找不到此问题的解决方案。 有什么帮助吗?

【问题讨论】:

我们可以看一个活生生的例子吗? 图像被挤向顶部。 是否发生在特定的浏览器中? 您能否展示导致问题的代码,即拍摄并绘制它的代码? 实际上当我在移动浏览器中运行提到的代码时,它会自动给出上面提到的两个选项。我没有为它写任何具体的代码。 【参考方案1】:

我在 PreviewImage 函数中注意到的第一件事是图像被绘制到画布的位置:

ctx.drawImage(base_image, 0, 0, 270, 300);

CanvasRenderingContext2D.drawImage 的最后两个属性将忽略纵横比,将图像大小调整为 270 x 300。如果删除它们,图像将以原始大小呈现。

ctx.drawImage(base_image, 0, 0);

要使图像适合画布的宽度,请使用以下内容:

ctx.drawImage(base_image, 0, 0, canvas.width, base_image.height * (canvas.width / base_image.width));

至于具有奇异高度(~50px)的图像渲染,这可能是与超过 2MB 的图像被二次采样相关的 ios 特定问题。请参阅HTML5 Canvas drawImage ratio bug iOS 了解更多信息。

【讨论】:

谢谢。我试试这个解决方案。

以上是关于画布中的 HTML5 图像适合问题的主要内容,如果未能解决你的问题,请参考以下文章

如何在不损失图像质量的情况下调整图像大小以适合小型 HTML5 画布? [复制]

如何将画布保存为html5中的图像?

HTML5 Canvas - 如何在画布中的图像上绘制矩形

将 html5 画布图像保存在本地硬盘上

使用画布的 HTML5 中的逐帧动画

在 HTML5 画布中剪切多个图像