canvas中图片大小自适应

canvas中图片自适应

图片在canvas中自适应大小并居中
通常图片大小与canvas的大小是不同的,分为以下几种情况

  • 图片高或宽,超过canvas高或宽
  • 图片高、宽,都超过canvas高宽;
  • 图片高、宽都小于canvas高、宽

问题的本质其实是动态计算图片大小,并在canvas适合的位置画出图片

直接上代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>canvas中图片大小自适应</title>
</head>
<body>
<canvas id="canvas" width="500" height="300"></canvas>
<style>
    #canvas {
        box-shadow: 0 0 2px black;
    }
</style>
<script>
    window.onload = () => {
        var canvas = document.getElementById("canvas");
        var w = canvas.width;
        var h = canvas.height;
        if (canvas.getContext) {
            var ctx = canvas.getContext('2d');
            var img = new Image()
            img.src = 'https://gtms02.alicdn.com/tps/i2/TB1ZeJGIXXXXXcnXXXXDgwcQVXX-375-130.jpg' // 图片地址示例
            img.onload = function () {
                var iw = this.width;
                var ih = this.height;
                var local = calculate(iw, ih)
                ctx.fillStyle = 'white';
                ctx.fill();
                ctx.drawImage(this, local.px, local.py, local.pw, local.ph)
            }
        }

        // 计算出图片画在canvas中的四个参数
        function calculate(pw, ph) {
            var px = 0;
            var py = 0;
            if(pw < w && ph < h){
                px = 0.5 * w - 0.5 * pw;
                py = 0.5 * h - 0.5 * ph;
            }else if (ph / pw > h / w) {
                var uu = ph;
                ph = h
                pw = pw * h / uu
                px = 0.5 * w - 0.5 * pw;
            } else {
                var uu = pw;
                pw = w;
                ph = ph * pw / uu
                py = 0.5 * h - 0.5 * ph;
            }
            return {px, py, pw, ph}
        }
    }
</script>
</body>
</html>

注意将示例中图片的src替换成自己的图片地址

  • 9
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值