Fabric.js画布图像抗锯齿

时间:2016-01-19 06:17:10

标签: javascript html5-canvas fabricjs

是否有办法使用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>

正如您所看到的,此图像看起来像是锯齿状。

2 个答案:

答案 0 :(得分:4)

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

向下缩小10倍会导致你的&#34; jaggies&#34;。是的,向下缩小会导致锯齿状,就像向上扩展会导致锯齿状一样。

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

以下是示例代码和演示:

将原始图像缩小4倍,然后应用scaleToHeight 以获取fabric.Image的最终大小。

enter image description here

&#13;
&#13;
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);
}
&#13;
body{ background-color: ivory; }
#canvas{border:1px solid red; margin:0 auto; }
&#13;
<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>
&#13;
&#13;
&#13;

答案 1 :(得分:4)

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

更新:从2017年7月开始,使用fabric 2.0,有一种lanzcos webgl实现,质量好,速度快。默认情况下,webgl已启用,并且webgl中没有替代alghoritm,仅限于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