在解决canvas合成图片模糊的问题想必我们已经了解了

  1. window.devicePixelRatio 
         window接口的devicePixelRatio返回当前显示设备的物理像素分辨率与CSS像素分辨率之比。 此值也可以解释为像素大小的比率:一个CSS像素的大小与一个物理像素的大小。 简单来说,它告诉浏览器应使用多少屏幕实际像素         来绘制单个CSS像素。
  2. 使用 ctx.scale(scale, scale)来解决合成后图片模糊的问题,但是移动端真机测试时候却发现scale却不生效,并且微信开发社区也已经明确指出原生组件的使用限制 部分 CSS 样式无法应用于原生组件,例如:
    • 无法对原生组件设置 CSS 动画
    • 无法定义原生组件为 position: fixed
    • 不能在父级节点使用 overflow: hidden 来裁剪原生组件的显示区域

如下面回复:

其实解决问题很简单,既然scalse 不生效,手动放大倍数不就行了吗!

解决思路:

1.拿到devicePixelRatio

var ratio = window.devicePixelRatio;

2.把画布放大

canvas.width = Math.floor(size * ratio); canvas.height = Math.floor(size * ratio);
只放大画布的情况下合成效果如下:

3.合成时候同样把文字位置、大小进行放大(替换scale的效果)

ctx.fillRect(10 * ratio, 10 * ratio, 300 * ratio, 300 * ratio);

var x = size / 2;
var y = size / 2; var textString = "I love MDN";
ctx.fillText(textString, x * scale, y * ratio)

下面是csdn一个解决方案:

var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d'); // Set display size (css pixels).
var size = 200;
canvas.style.width = size + "px";
canvas.style.height = size + "px"; // Set actual size in memory (scaled to account for extra pixel density).
var scale = window.devicePixelRatio; // Change to 1 on retina screens to see blurry canvas.
canvas.width = Math.floor(size * scale);
canvas.height = Math.floor(size * scale); // Normalize coordinate system to use css pixels.
ctx.scale(scale, scale); ctx.fillStyle = "#bada55";
ctx.fillRect(10, 10, 300, 300);
ctx.fillStyle = "#ffffff";
ctx.font = '18px Arial';
ctx.textAlign = 'center';
ctx.textBaseline = 'middle'; var x = size / 2;
var y = size / 2; var textString = "I love MDN";
ctx.fillText(textString, x, y)

更改后的兼容代码

var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d'); // Set display size (css pixels).
var size = 200;
canvas.style.width = size + "px";
canvas.style.height = size + "px"; // Set actual size in memory (scaled to account for extra pixel density).
var scale = window.devicePixelRatio; // Change to 1 on retina screens to see blurry canvas.
canvas.width = Math.floor(size * scale);
canvas.height = Math.floor(size * scale); // Normalize coordinate system to use css pixels. ctx.fillStyle = "#bada55";
ctx.fillRect(10 * scale , 10 * scale , 300 * scale , 300 * scale );
ctx.fillStyle = "#ffffff";
ctx.font = '18px Arial';
ctx.textAlign = 'center';
ctx.textBaseline = 'middle'; var x = size / 2;
var y = size / 2; var textString = "I love MDN";
ctx.fillText(textString, x* scale, y * scale)

H5 canvas 解决合成图模糊(canvas真机下scale不起作用,无法缩放显示的问题)的更多相关文章

  1. 解决小程序中 cover-view无法盖住canvas的问题,仅安卓真机出现

    原因在于系统页面渲染的差异,在安卓中页面dom的渲染并不是完成按照上下顺序来的, 有可能出现写在后面的dom被先渲染出来,因此会随机出现能盖住.不能盖住的情况,很诡异是不是? 开发者工具中并非真机,只 ...

  2. 解决Xcode 9.2系统真机测试时出现 could not find developer disk image问题

    解决Xcode在ipad/iphone 9.2 系统真机测试时出现could not find developer disk image问题 第一种方法:拷贝这个文件(http://download. ...

  3. 解决微信小程序wepy真机预览跟本地表现不一样,数据变化了视图没变化

    当时搜了很多相关问题都没找到相似的 只看到有这个相似的描述wepy在onLoad里修改data-object的值页面不渲染 ,通过setData解决的. 但是这个还不是根本的解决办法,有些地方用set ...

  4. 真机下, 如何在File Explorer里看data下的数据?

    首先手机得Root , 你如果想单个单个的看, root explorer可以设置Permission Other下的两个权限点上就ok了. 如果想看到所有的, 即子目录也可以看到, 只需要adb r ...

  5. IOS真机Profile时调用树中的对象只是显示地址,没有显示symbol name

    解决问题的办法: 1.确认工程设置中的Scheme,profile选项对应的是debug版本还是release版本 2.确认工程设置中debug版本或者release版本是否生成了符号表 " ...

  6. iOS打包Framework真机和模拟器兼容合并版本 - 详细攻略步骤

    打包Framework,测试时: 1.用模拟器打包,测试时只能跑在模拟器 2.用真机打包,测试时只能跑在真机 那么怎么做到一个版本兼容以上两种场景呢? 解决如下: 1.打开终端 2.输入   lipo ...

  7. Unity3D连接真机调试教程,可抓断点

    源地址:http://www.unity蛮牛.com/thread-19586-1-1.html <ignore_js_op> 未标题-1.jpg (52.33 KB, 下载次数: 0) ...

  8. 如何在 iOS 真机运行 Appium

    使用 gui 启动的 appium 1.2.2 也会有这个问题,所以你要把 deviceconsole 复制到 /Applications/Appium.app/Contents/Resources/ ...

  9. 关于用wkwebview加载沙盒documents下html文件 模拟器可以,真机不行的解决方案

    最近也遇到这个问题,把我解决的思路记录一下 1.问题: 用wkwebview加载(loadRequest)沙盒documents下html文件 模拟器可以,真机不行 (前提是html内部含引用外联样式 ...

随机推荐

  1. 编写Java程序,通过接口摸拟麦当劳食物生产过程,接口设计

    返回本章节 返回作业目录 需求说明: 通过接口摸拟麦当劳食物生产过程 实现思路: 通过接口摸拟麦当劳食物生产过程的实现思路: 创建接口食物(Food),该接口需要被所有的食物类所实现.在该接口中定义g ...

  2. k8s-svc

    1. 简介 kubernets service 是将运行一组pods上的应用程序公开为网络服务的抽象方法. 有了 kubernets service,你就无需修改应用程序即可使用服务发现机制,kube ...

  3. DRF框架在嵌套关系下实现嵌套对象字段的过滤

    当需要对关联对象的字段进行选择性显示时,在所对应的serializer类中声明引用的字段. 例如: class TrackSerializer(serializers.ModelSerializer) ...

  4. 基于CentOS6.5-Hadoop2.7.3-hive-2.1.1安装sqoop1.4.7

    注:图片如果损坏,点击文章链接:https://www.toutiao.com/i6627736198431375879/ 系统版本,Hadoop已安装完成.链接<CentOS6.5下安装Had ...

  5. SSM工程常见问题

    1.引入Junit测试 <!--引入junit单元测试,两个一起引用,spring-test版本要与Spring-core保持一致--> <dependency> <gr ...

  6. Javascript实现让图片一直跟着鼠标移动

    Javascript实现让图片一直跟着鼠标移动 注意:图片可能加载不出来,还请及时更换图片 <!doctype html> <html> <head> <me ...

  7. Golang单元测试框架整理

    目录 一.单元测试是什么 二.单元测试的意义 三.Golang单元测试框架 3.1 Golang内置testing包 3.1.1 简单的测试 3.1.2 Benchmark 基准测试 3.1.3 运行 ...

  8. 【经验总结-markdown】markdown字体和颜色设置

    字体设置 关键词为face <font face = "黑体">我是黑体</font> <font face = "宋体"> ...

  9. 【记录一个问题】redis中执行事务出现错误“EXECABORT Transaction discarded because of previous errors”

    执行事务的大致代码如下: redisClient := GetRedisClient() pipe := redisClient.TxPipeline() err := pipe.ZAdd(k, ar ...

  10. k8s-storage-class

    1. 简介 StorageClass 为管理员提供了描述存储 "类" 的方法. 通过StorageClass的定义,管理员可以将存储资源定义为某种类别(Class),正如存储设备对 ...