【问题标题】:Fabric.js canvas image antialiasingFabric.js 画布图像抗锯齿
【发布时间】:2016-04-24 12:15:07
【问题描述】:

有没有办法使用fabric.js 对添加到画布的图像进行抗锯齿处理 我在使用 scaleToHeight 函数时遇到了麻烦。我在面料库中找不到任何合适的选项。

var canvas = new fabric.Canvas('canvas');
var url = 'https://grafikoan.files.wordpress.com/2012/10/spheres-grafic-design-grafikoan-hd-300-p-2.png';
fabric.Image.fromURL(url, function (oImg) {
	oImg.scaleToHeight(canvas.getHeight());
  canvas.add(oImg);
  canvas.renderAll();
});
<script src="http://cdnjs.cloudflare.com/ajax/libs/fabric.js/1.5.0/fabric.min.js"></script>
<canvas id="canvas" width=400 height=300></canvas>

如您所见,此图像看起来参差不齐。

【问题讨论】:

    标签: javascript html5-canvas fabricjs


    【解决方案1】:

    原始图像是所需尺寸的 10 倍。

    向下缩放 10 倍会导致您的“锯齿”。是的,向下缩放会导致锯齿状,就像向上缩放会导致锯齿状一样。

    您可以通过逐步将原始图像向下缩放到所需大小来减少锯齿。

    这是示例代码和演示:

    将原始图像缩小 4 倍一半,然后应用 scaleToHeight 得到 fabric.Image 的最终尺寸。

    var canvas = new fabric.Canvas('canvas');
    
    var downscaledImg;
    var img=new Image();
    img.onload=start;
    img.src="https://grafikoan.files.wordpress.com/2012/10/spheres-grafic-design-grafikoan-hd-300-p-2.png";
    function start(){
        // create a canvas that is 4x smaller than the original img
        downscaledImg=downscale(img,4);
        // create a fabric.Image from the downscaled image
        var fImg=new fabric.Image(downscaledImg);
        fImg.scaleToHeight(canvas.getHeight());
        canvas.add(fImg);
        canvas.renderAll();
    }
    
    function downscale(img,halfCount){
        var cc;
        var c=document.createElement('canvas');
        c.width=img.width/2;
        c.height=img.height/2;
        c.getContext('2d').drawImage(img,0,0,img.width/2,img.height/2);
        halfCount--;
        for(var i=0;i<halfCount;i++){
            cc=document.createElement('canvas');
            cc.width=c.width/2;
            cc.height=c.height/2;
            cc.getContext('2d').drawImage(c,0,0,c.width/2,c.height/2);
            halfCount--;
            c=cc;
        }
        return(c);
    }
    body{ background-color: ivory; }
    #canvas{border:1px solid red; margin:0 auto; }
    <script src="http://cdnjs.cloudflare.com/ajax/libs/fabric.js/1.5.0/fabric.min.js"></script>
    <canvas id="canvas" width=400 height=300></canvas>    </body>

    【讨论】:

    • 喜欢这个解决方案,非常适合缩小尺寸! Here is a tweaked version 我从循环中创建了画布,所以只有 2 个画布和 2 次调用 getContext
    • 是的,这非常有效。但是当画布再次缩放(不是图像)到更大尺寸时会出现一个问题
    • 这个答案也可以按预期工作。但是当我给出最终输出时,我需要将画布缩放到更大的尺寸。所以我使用过滤器方法,以便在给出最终输出时可以删除过滤器。所以我正在使用 AndreaBogazzi 提供的答案。但我必须说这是非常有用的答案。谢谢
    【解决方案2】:

    fabricjs 有自己的调整大小过滤来避免锯齿。 调整大小过滤器,类型为“sliceHack”是最快/好的结果之一。 如果您不需要调整大小的动态过滤,您还可以使用 lanzcos 过滤、双线性、快速隐士。

    更新:自 2017 年 7 月以来,fabric 2.0 出现了一种质量好且速度非常快的 lanzcos webgl 实现。默认情况下 webgl 是打开的,并且 webgl 中没有替代算法,只有 lanzcos。

    var canvas = new fabric.Canvas('canvas');
    var url = 'https://grafikoan.files.wordpress.com/2012/10/spheres-grafic-design-grafikoan-hd-300-p-2.png';
    fabric.Image.fromURL(url, function (oImg) {
        var scaling = canvas.getHeight() / oImg.height;
        oImg.filters.push(new fabric.Image.filters.Resize({
            resizeType: 'sliceHack', scaleX: scaling , scaleY: scaling 
        }));
      canvas.add(oImg);
      oImg.applyFilters(canvas.renderAll.bind(canvas));  
    },{ crossOrigin: 'Anonymous' });
    body{ background-color: ivory; }
    #canvas{border:1px solid red; margin:0 auto; }
    <script src="http://www.deltalink.it/andreab/fabric/fabric.js"></script>
    <canvas id="canvas" width=400 height=300></canvas>

    请查看此链接以获取没有 CoR 问题的工作示例。

    http://www.deltalink.it/andreab/fabric/resize.html

    比较 normale 图像和 sliceHack 图像,一旦你调整大小,过滤器就会启动。

    这里有更多例子:https://github.com/kangax/fabric.js/issues/1741

    【讨论】:

    • 这仍然有锯齿
    • 因为我这里有 cors 问题。我添加了一个工作示例。
    • cros origin 可以通过以下方式更正:fabric.Image.fromURL(url, function (oImg) { //code here },{ crossOrigin: 'anonymous' });
    • 这仅在图像缩放后有效。当图像加载其锯齿状。这是为什么呢?
    • 啊发现问题了。应用过滤器还不够。它应该是 oImg.applyFilters(canvas.renderAll.bind(canvas));
    猜你喜欢
    • 2011-08-27
    • 2015-05-21
    • 1970-01-01
    • 2011-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 2013-03-26
    相关资源
    最近更新 更多