织物帆布-图像分辨率非常差

时间:2018-09-01 12:22:01

标签: javascript html canvas fabricjs resolution

我正在为编辑工具的应用程序中实现Fabricjs。我需要在画布上设置高分辨率图像。如果我使用setBackgroundImage方法,则该方法仅适用于小尺寸(尺寸远远小于画布)的图像。因此,我需要减小图像的大小(但需要保持比例),以使图像看起来更好。

我的第一个想法是降低采样率,该采样率对某些图片有效,但对所有图片均无效。这是代码:

方法1)

var steps = 2;
var imgAspect = img.width / img.height;
var oc = document.createElement('canvas');
octx = oc.getContext('2d');

for(var i = 0; i < steps; i++){
    if(i == 0){
        oc.width = img.width * 0.5;
        oc.height = img.height * 0.5;
        octx.drawImage(img, 0, 0, oc.width, oc.height);
    }
    else{
        octx.drawImage(oc, 0, 0, oc.width * 0.5, oc.height * 0.5);
    }
}

_w = canvas.width;
_h = canvas.height;

ctx.drawImage(oc, 0, 0, oc.width * 0.5, oc.height * 0.5, 0, 0, _w, _h);

var data = ctx.getImageData(0, 0, canvas.width, canvas.height);
var c = document.createElement('canvas');
c.setAttribute('id', '_temp_canvas');
c.width = canvas.width;
c.height = canvas.height;
c.getContext('2d').putImageData(data, 0, 0);

var img = fabric.Image.fromURL(c.toDataURL(), function(img) {
    img.left = 00;
    img.top = 00;
    img.isFixed = true;
    img.selectable = false;
    canvas.add(img);
    c = null;
    $('#_temp_canvas').remove();

    canvas.renderAll();
});

我的第二个想法是,我从here开始,它看起来非常简单

var canvasCopy = document.createElement("canvas")
var copyContext = canvasCopy.getContext("2d")
var ratio = 1;

if(img.width > canvas.width){
    ratio = canvas.width / img.width;
}
else if(img.height > canvas.height){
    ratio = canvas.height / img.height;
}

canvasCopy.width = img.width;
canvasCopy.height = img.height;
copyContext.drawImage(img, 0, 0);

canvas.width = img.width * ratio;
canvas.height = img.height * ratio;

ctx.drawImage(canvasCopy, 0, 0, canvasCopy.width, canvasCopy.height, 0, 0, canvas.width, canvas.height);

问题是它们都不产生良好的分辨率。方法1对于某些图片效果很好,但是对于少数图片却失败。如果我尝试方法2,它可以处理方法1中的失败图片。有人可以帮助解决有关分辨率的问题吗?

查看fiddle1fiddle2的2张不同图片。您可以通过在method1函数中调用method2_img.onload来查看差异。

1 个答案:

答案 0 :(得分:1)

我不知道这是否是您的情况,但对我来说,imageSmoothingEnabled=false就像

var canvasCopy = document.createElement("canvas")
var copyContext = canvasCopy.getContext("2d")
copyContext.imageSmoothingEnabled = false;

参考http://fabricjs.com/lanczos-webgl