drawImage() 的锯齿问题

2017年9月5日

背景

遇到 Canvas 使用 drawImage() 绘制图形出现锯齿严重的问题。

drawImage()

drawImage() 方法在画布上绘制图像、画布或视频
drawImage() 方法也能够绘制图像时,增加或减少图像的尺寸。

context.drawImage(img,sx,sy,swidth,sheight,x,y,width,height);

原因

小尺寸的图片放大会模糊,是因为像素信息不足,但为何大图片缩小会有锯齿?

我的理解:
缩小图形,相当于主动丢失一些像素信息。那么如何选择要丢弃的信息呢?取决于各类压缩算法。若丢掉了“不该丢”的像素,就会影响到图片质量了。
而 canvas 没有提供特别好的位图插值算法。

措施

  1. 对半缩小(step-down)

经测试,若依次对半缩小,会比一次性缩小到位要好得多。

弊端,不能随心所欲缩小到指定的长宽,而是只能是原图的倍数缩减。


  1. imagesmoothingquality

目前好像只有 chrome 支持此属性

context.imageSmoothingQuality = "low|medium|high"

资源

  1. https://stackoverflow.com/questions/28498014/canvas-drawimage-poor-quality
  2. https://stackoverflow.com/questions/17861447/html5-canvas-drawimage-how-to-apply-antialiasing
  3. https://devdocs.io/dom/canvasrenderingcontext2d/imagesmoothingquality
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一:canvas简介 1.1什么是canvas? ①:canvas是HTML5提供的一种新标签 ②:HTML5 ...
    GreenHand1阅读 4,791评论 2 32
  • 线条样式 绘制直线,第五章知识简单回顾 lineWidth 设置或返回当前的线条宽度,单位为像素 lineCap ...
    Zd_silent阅读 515评论 0 0
  • 本文首发于我的个人博客:http://cherryblog.site/github项目地址:https://git...
    sunshine小小倩阅读 2,045评论 1 8
  • 一、canvas简介 1.1 什么是canvas?(了解) 是HTML5提供的一种新标签 Canvas是一个矩形区...
    J_L_L阅读 1,579评论 0 4
  • 【Android 自定义View之绘图】 基础图形的绘制 一、Paint与Canvas 绘图需要两个工具,笔和纸。...
    Rtia阅读 11,851评论 5 34