【问题标题】:KineticJS: How do I downsize a PNG/JPG Image in KineticJS maintaining high Quality?KineticJS:如何在 KineticJS 中缩小 PNG/JPG 图像的大小以保持高质量?
【发布时间】:2014-06-02 05:22:27
【问题描述】:

我想在 KineticJS 中缩小 PNG/JPG 图像的大小而不降低质量。

我做了以下,但导致质量很差:

var stage = new Kinetic.Stage({
    container: 'container',
    width: 1000,
    height: 1000
});
var layer = new Kinetic.Layer();

var imageObj = new Image();
imageObj.onload = function () {
    var someImage = new Kinetic.Image({
        image: imageObj,
    });

    // add the shape to the layer
    layer.add(someImage);

    // add the layer to the stage
    stage.add(layer);

    someImage.scale({
        x: 500,
        y: 500
    });
    layer.draw();
};
imageObj.src = // some image;

【问题讨论】:

  • 由于 PNG 图像由 像素 - 离散点组成 - 缩小它们会总是 降级图像。只有当您想象一个 100x100 的白色正方形,其中心有一个 50x50 的红色正方形时,“不失质量”才有意义;这可以“不损失质量”缩小到其原始尺寸的 1/2、1/5、1/10 和 1/25。

标签: javascript html canvas kineticjs


【解决方案1】:

您可以通过逐步缩小图像来获得良好的效果。

这是一个获取源图像(或画布)并将其缩小的函数:

function scaleImage(source,scaleFactor){
    var canvas=document.createElement("canvas");
    var ctx=canvas.getContext("2d");
    canvas.width=source.width*scaleFactor;
    canvas.height=source.height*scaleFactor;
    ctx.drawImage(source,0,0,source.width*scaleFactor,source.height*scaleFactor);
    return(canvas);
}

scaleImage 函数可以像这样用于缩小非常大的图像:

演示:http://jsfiddle.net/m1erickson/zYLLe/

var img=new Image();
img.onload=start;
img.src="hugeImage.png";
function start(){

    // c1 is 0.50 the size of img

    var c1=scaleImage(img,0.50);

    // c2 is 0.50 the size of c1  (==25% of the original img)

    var c2=scaleImage(c1,0.50);

    // and then create a Kinetic.Image using c2 as a source

    image1 = new Kinetic.Image({
        x:10,
        y:10,
        image:c2,
        draggable: true
    });
    layer.add(image1);
    layer.draw();
}

【讨论】:

  • 这是否意味着我采取的比例步骤越多质量越好?
  • 如果您一步从 100% 缩小到 25%,您会损失很多质量。在 2+ 步骤中缩小尺寸将使您不会失去尽可能多的质量。无论您放大或缩小像素(图像),都会损失一些质量。 2+ 步解决方案只是在缩放期间损失较少的质量。 ;=)
  • 还有另一种方法可以在缩小尺寸的同时获得高质量。使用您提出的方法,我经常得到非常模糊的图像?
  • 真的--我对这种方法有更好的体验吗?也许使用您之前缩小问题的答案之一,然后使用缩小的画布创建 Kinetic.Image:stackoverflow.com/questions/18922880/…
  • 好的,我会的。谢谢!
猜你喜欢
  • 2019-12-27
  • 1970-01-01
  • 2014-05-28
  • 1970-01-01
  • 2011-06-23
  • 1970-01-01
  • 2013-02-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多