hidpi-canvas-polyfill 绘制高清图片

 一、安装  1 <script src=".../dist/hidpi-canvas.min.js"></script>

   二、原理  在 window 中有一个 devicePixelRatio 的属性,类似的,在 canvas context 中也存在一个BackingStorePixelRatio 的属性,该属性的值决定了浏览器在渲染 canvas 之前会用几个像素来来存储画布信息。如果 BackingStorePixelRatio 值是2,将一张100x100像素的图片绘制到浏览器中,该图片首先会在内存中生成一张200x200的图片,然后浏览器渲染的时候,会按100x100的图片来渲染,因此就变成了200x200,正好和内存中的图片大小一致,因此不会出现失真的问题。  那我们怎样让所有手机都不失真呢?我们可以根据 devicePixelRatio 与 BackingStorePixelRatio 的比值来决定canvas绘制时的坐标和大小。对应的canvas画布大小也要根据比值来设置。

   三、使用  使用起来其实也很简单,下面举一个栗子(在 canvas 上绘制2张图片):  1 2 3 4 5 6 7 8 9 10 // 获取设备像素比 var getPixelRatio = function(context) {         var backingStore = context.backingStorePixelRatio ||               context.webkitBackingStorePixelRatio ||               context.mozBackingStorePixelRatio ||               context.msBackingStorePixelRatio ||               context.oBackingStorePixelRatio ||               context.backingStorePixelRatio || 1;       return (window.devicePixelRatio || 1) / backingStore; };   1 2 3 4 5 6 7 8 9 10 11 12 13 var canvas = document.getElementById("canvas");  var ctx = canvas.getContext('2d');   // 加载图片 var img1 = new Image();     img1.src = "img/1.png";       img1.onload = function() {               var img2 = new Image();                     img2.src = "img/2.png";               img2.onload = function() {                       drawImg(ctx, getPixelRatio, img1, img2);             }       }   1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 // 绘制图片 function drawImg(ctx, ratio, image1, image2){     // 对图片先缩小再放大     var swidth1 = image1.width;          var sheight1 = image1.height;            var width1 = 0.5 * swidth1;            var height1 = 0.5 * sheight1;          var img1Width = width1 * ratio;            var img1Height = height1 * ratio;            // 第二张图片的大小必须依据第一张图片的尺寸来(比如第一张图片的 width 是526,height 是1112),不然展示出来的图片大小就不对     var swidth2 = img1Width * 484 / 526;         var sheight2 = img1Height * 768 / 1112;          var img2Left = img1Width * 25 / 526;         var img2Top = img1Height * 172 / 1112;            // 绘制图片     ctx.drawImage(image1, 0, 0, img1Width, img1Height);     ctx.drawImage(image2, img2Left, img2Top, swidth2, sheight2);           // 生成 base64 的图片                                     var img = new Image();          img.src = canvas.toDataURL('image/jpeg', 0.5); // 压缩图片,默认压缩比是0.5                       $("body").prepend(img); }   对应的这样处理之后,文字绘制在 canvas 上也会很清晰,就不举例了,大家自行去尝试~

 

 

链接:https://www.jianshu.com/p/e6f965eb01d3

posted @ 2020-02-27 15:32  苹果π  阅读(749)  评论(0)    收藏  举报