js使用canvas绘制高清图片

H5能使用canvas绘制图像,但是有些时候我们需要绘制高清的图片。

先介绍下几个定义:

什么是devicePixelRatio:

window.devicePixelRatio是设备上物理像素和设备独立像素(device-independent pixels
(dips))的比例。 公式表示就是:window.devicePixelRatio = 物理像素 / dips

dip或dp,(device independent pixels,设备独立像素)与屏幕密度有关。dip可以用来辅助区分视网膜设备还是非视网膜设备。
如果devicePixelRatio > 1说明是高清屏幕了,现在的手机设备很多都是高清屏幕,我的手机devicePixelRatio 是2。

js代码

(function() {
    var img = null; //在需要绘制的图片放在方法外定义,如果一个画板多次绘制时,不会出现闪屏的问题。
    var w = 0, h = 0 ; //图片显示的宽高
    var ratio = 1 ; //devicePixelRatio值
    var ratio_w = 0, ratio_h = 0; //绘制高清图片宽高

    var canvas = document.getElementById("canvas"),
        ctx = canvas.getContext("2d");

    $("#drawImg").each(function() {

        //只有当屏幕宽度变化和img对象为空时候才进行一次初始化参数
        if(img == null || w != window.innerWidth) {
            ratio = getPixelRatio(ctx); //获取设备的devicePixelRatio
            w = window.innerWidth;  //获取设备的显示屏幕宽高
            h = this.height * (window.innerWidth / this.width); //图片加载完this.height才大于0.

            ratio_w = canvas.width = w * ratio;  //计算屏幕的高清图片的宽高,同时设置画板的像素  
            ratio_h = canvas.height = h * ratio;

            img = new Image(ratio_w, ratio_h);   //多次创建imgae绘制会闪屏

            //这个是重点,我们需要把canvas画板通过css样式控制显示高度
            $("#canvas").css({
                width: (w + 'px'),
                height: (h + 'px')
            });
        }

        img.src = "images/foo.png";
        //只有在load完成才会进行绘制。所以绘制需要写在onload事件中
        img.onload = function() {
            ctx.clearRect(0, 0, ratio_w, ratio_h); //清除画板,不清除图像会覆盖。
            ctx.drawImage(img, 0, 0, ratio_w, ratio_h); //绘制高清图片
        }
    });


    //获取设备的devicePixelRatio
    function getPixelRatio(context) {
        var backingStore = context.backingStorePixelRatio ||
            context.webkitBackingStorePixelRatio ||
            context.mozBackingStorePixelRatio ||
            context.msBackingStorePixelRatio ||
            context.oBackingStorePixelRatio ||
            context.backingStorePixelRatio || 1;
        return(window.devicePixelRatio || 1) / backingStore;
    };
})()

html代码

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <script src="//cdn.bootcss.com/jquery/1.12.4/jquery.min.js"></script>
    </head>
    <body>
        <img id="drawImg" src="images/foo.png" style="display: none;"/>
        <canvas id="canvas"></canvas>
        <script type="text/javascript" src="js/star.js" ></script>
    </body>
</html>

绘制成功,我们看下看html的canvas代码,style中的高宽是属性中的高宽的50%,因为设备的devicePixelRatio为2。也就是说,画板像素就是图片像素大小,但是显示大小为屏幕大小
宽高样式变化了

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值