问题描述:

这个问题出现在我尝试通过如下方式保存Canvas内容时:

var imgCanvas = document.getElementById('canvas'); // get the canvas created by p5js
var imageAsDataURL = imgCanvas.toDataURL("image/png");
localStorage.setItem("name", imageAsDataURL);

Canvas我设置的大小是600x480,这个在低分辨率上的显示器上保存的图片也是600x480,但是在Retina显示器上,得出的结果就是1200x960,结果被放大了两倍。

在查看元素时,可以看到,低分辨率的显示器上:

<canvas id="canvas" class="canvas" width="600" height="480" style="width: 600px; height: 480px;"></canvas>

Retina屏上:

<canvas id="canvas" class="canvas" width="1200" height="960" style="width: 600px; height: 480px;"></canvas>

style内的widthheight表示页面上显示的大小,而外面的widthheight才是实际的大小,也就是保存时的真实大小。

也就是说,在高分辨率的显示器上创建Canvas:

canvas = createCanvas(width, height);

会根据window.devicePixelRatio的值,扩大实际保存大小,而页面上渲染的大小与设定时是保持一致的。

我的需求是,设置的Canvas大小为600x480,在新的大小相等的Canvas上加载前面保存的图片,能够全部加载进来,而不是剪切过只剩下一半的图片

换句话说,我的需求是,如何加载一个分辨率是Canvas两倍大的图片,且全部能够加载进来?

我用到的加载图片到Canvas的方法是:

function loadImageToCanvas(context, image) {console.log(context);var baseImage = new Image();baseImage.src = image;baseImage.onload = function() {context.drawImage(baseImage, 0, 0);};
}

这里有异步加载的问题,且这里传入的image是data:image/png;base64的图片,context是Canvas的上下文。

结果,我发现,理清自己的需求后,在加载图片时,图片的大小是1200x960,但是我们想要它适应600x480大小的Canvas,只需要在drawImage这里,改成:

function loadImageToCanvas(context, image) {console.log(context);var baseImage = new Image();baseImage.src = image;baseImage.onload = function() {// 只改这一行即可context.drawImage(baseImage, 0, 0, 600, 480);};
}

看到,context.drawImage(baseImage, 0, 0, 600, 480);这行是设定了我们想要的图片大小,结果不是剪切,而是缩放,惊喜啊。

注:这个问题困扰我大概5个小时吧,断断续续跨度一天。

END.

【前端】Canvas通过toDataURL保存时在Mac上分辨率扩大问题相关推荐

  1. img src php 微信 苹果,javascript - file上传的图片,生成到canvas,toDataUrl后在苹果微信上保存下来,是黑色的。...

    我用input file上传图片后,加到canvas里,然后toDataUrl,把地址添加到img上显示,是可以得.但我在苹果微信上,长按保存到本地后,却是黑色的,只有在苹果微信上发现到这问题.... ...

  2. dropbox mac_如何在Windows或Mac上启动时阻止Dropbox打开

    dropbox mac Dropbox is a handy way to synchronize files across devices via the cloud. By default, Dr ...

  3. mac pdf去水印_如何在Mac上为PDF添加水印

    在Mac上为PDF添加水印能够防止别人伪造文档,并且大大提高安全性.因此,当您想在文档上标明所有权或者不希望您的文档被复制时,添加水印就能派上用场.本文将告诉您如何在Mac设备(包括Mojave)上批 ...

  4. 如何在 Mac上使用预览解锁 PDF

    预览是在 Mac 上打开.查看.编辑和管理图像和 PDF 文件的免费实用程序.它满足您处理 PDF 的所有基本需求,包括加密和解锁 PDF. 好处: 免费使用: 保护和解锁 PDF: 缺点: 需要输入 ...

  5. vmospro启动黑屏_在Mac上从睡眠唤醒中修复黑屏 | MOS86

    有时候,当Mac用户从睡眠状态唤醒Mac时,Mac用户可能会遇到黑屏.如果你遇到这个问题,这个问题是很明显的当您尝试从睡眠中唤醒Mac或打开MacBook盖子时,屏幕保持黑色,尽管计算机显然清醒,键盘 ...

  6. 如何在Mac上刻录DVD以获取可播放的视频?

    从现代计算机中卸下了光驱.因此,您的MacBook将比以前更轻,更薄.但是,如果要在Mac上播放DVD,则需要先将外部硬盘驱动器连接到Mac计算机.以后,您需要插入DVD光盘以提取DVD电影.整个DV ...

  7. 如何在Mac上刻录DVD以获取可播放的视频?解答来了

    从现代计算机中卸下了光驱.因此,您的MacBook将比以前更轻,更薄.但是,如果要在Mac上播放DVD,则需要先将外部硬盘驱动器连接到Mac计算机.以后,您需要插入DVD光盘以提取DVD电影.整个DV ...

  8. 前端 canvas toDataURL() 转图片生成空白图片问题

    这里写自定义目录标题 前端 canvas toDataUrl() 转图片生成空白图片问题 感谢大神 解决方法 问题发生 解决办法原理 vue项目中的使用 总结 2022-05-17追加修改 前端 ca ...

  9. 前端:JS/38/canvas状态的保存和恢复(canvas常用状态大全),canvas画布中图像的变形

    canvas状态的保存和恢复 Saving and restoring state 在了解变形之前,我先介绍两个在你开始绘制复杂图形时必不可少的方法. canvas.save() 保存画布(canva ...

最新文章

  1. python啥意思-星号*在Python中是什么意思?
  2. [转载]Lua和C++交互详细总结
  3. PCL点云库用Poisson网格化实现点云的表面重建
  4. 根据文件路径检测文件大小并检测是否正在被占用
  5. [No0000F4]C# 枚举(Enum)
  6. Java线程阻塞原语-LockSupport
  7. Ubuntu:最简单的Ubuntu安装工具Wubi
  8. 传苹果新iPhone显示屏4英寸 可视面积扩大30%
  9. [svc]rsync简单部署
  10. 3500份课程课后习题答案与大家分享
  11. keil_v4 安装(图文教程)
  12. win+快捷键(常用)
  13. iSecure Center 综合安防管理平台
  14. 新北京交通限行时间、尾号查询
  15. 微软的产品激活中心电话
  16. Ubuntu 修复弹出U盘“An operation is pending”
  17. 概率DP——BZOJ4008 [HNOI2015]亚瑟王
  18. 请解释一下集成运放虚短,虚断,虚地这几个概念
  19. Qt5.14.2下载与安装
  20. mysql默认民族_56个民族及民族代码的sql语句

热门文章

  1. LabVIEW2020下载与安装教程
  2. python-opencv中的cv.CreateImage函数的参数问题
  3. linux php添加mysql扩展模块_linux下为php添加扩展库的方法
  4. python图片转视频加特效_使用Python opencv实现视频与图片的相互转换
  5. c++ floor 赋值_C++之floor函数
  6. 静态配置_配置静态LSP示例
  7. mvc创建连接mysql_五、 创建连接串连接本地数据库(ASP.NET MVC5 系列)
  8. 计算器的二进制功能java_Java二进制文字– Java 7功能
  9. sql数据库自动增量备份_SQL自动增量
  10. jQuery窗口调整大小