javascript - 使用 Canvas 调整图像大小而不失真

标签 javascript html canvas drawimage

<分区>

我正在尝试在 Canvas 内加载存储在本地计算机中的图像文件。我可以在 Canvas 中加载图像,但如果图像的宽度或高度非常大,图像就会变形。我想使用 Canvas 将图像的尺寸调整为 300 x 300,而不管图像的大小如何都不会扭曲图像。我尝试了很长时间,但无法弄清楚我哪里出错了。请帮助..

HTML代码..

 <input type="file" id="ifile">
 <canvas id="panel"></canvas> 

JS 代码..

 //beginning of image display
        canvasCtx = document.getElementById("panel").getContext("2d");

        document.getElementById("ifile").onchange = function(event) {

            this.imageFile = event.target.files[0];

            var reader = new FileReader();
            reader.onload =  function(event) {
                var img = new Image();
                //img.style.width = "300px";
                //img.style.height = "300px";

                img.onload = function() {
                    drawImage(img);
                }
                img.src = event.target.result;

            }
            reader.readAsDataURL(this.imageFile);
        }

        drawImage = function(img) {
            this.canvasCtx.canvas.width = 300;//img.width;
            this.canvasCtx.canvas.height = 300;//img.height;
            this.canvasCtx.drawImage(img,0,0,300,300);
            url = canvasCtx.canvas.toDataURL();
            console.log(url);
        }           
        //end of image display

下面也给出了 JS Fiddle 的链接...

JS Fiddle

最佳答案

更改您的 drawImage 函数,如下所示。我在顶部声明了一个全局变量 canvas

drawImage = function(img) {
    // if else to keep aspect ratio in 300X300
    if(img.width>img.height){
        canvas.width = 300;
        canvas.height = 300 / img.width * img.height;
    } else {
        canvas.width = 300 / img.height * img.width;
        canvas.height = 300;
    }    

    this.canvasCtx.drawImage(img, 0, 0, canvas.width, canvas.height);
    url = canvasCtx.canvas.toDataURL();
}

UPDATED FIDDLE

关于javascript - 使用 Canvas 调整图像大小而不失真,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35202589/

相关文章:

javascript - 为什么这不是按照我期望的方式添加类(class)?

javascript - Angular js - 返回一个带有 HTML 字符的字符串

javascript - HTML5 Canvas 获取变换矩阵?

javascript - 如何设置特定类紧随另一个跨度之后的跨度的样式

javascript - 上传图片并重定向到新页面,无需刷新

javascript - JS 对象解构以访问属性以进行评估而不实例化变量

html - "start from scratch"CSS 格式的正确容器?

javascript - 单击触发器内的元素时如何防止 Bootstrap Modal 打开?

javascript - 在图像上使用 "getImageData(...)"(或类似)的方法?

javascript - 在浏览器窗口的中心渲染 Canvas 圆