使用 createjs / easeljs 调整图像大小

Resizing images using createjs / easeljs

我想使用 createjs 动态缩小我 canvas 上的一些图像,然后存储较小的图像以在缩小 canvas 时出于性能原因显示。现在,我正在使用以下代码:

var bitmap = createjs.Bitmap('somefile.png');
// wait for bitmap to load (using preload.js etc.)

var oc = document.createElement('canvas');
var octx = oc.getContext('2d');
oc.width = bitmap.image.width*0.5;
oc.height = bitmap.image.height*0.5;
octx.drawImage(bitmap.image, 0, 0, oc.width, oc.height);

var dataUrl = oc.toDataURL('image/png'); // very expensive
var smallBitmap = new createjs.Bitmap(dataUrl);

这有效,但是:

  1. 转换为 image/png 时,toDataURL 操作非常昂贵,而且在实践中使用起来太慢(而且我无法转换为更快的 image/jpeg由于我尝试过的所有设置的输出质量都不够)

  2. 当然必须有一种方法可以缩小图像尺寸而不必求助于单独的 canvas 代码,然后手动进行转换以绘制到 createjs Bitmap 对象上??

我也试过:

octx.drawImage(bitmap.image, 0, 0, oc.width, oc.height);
var smallBitmap = new createjs.Bitmap(oc);

但是虽然速度很快,但这似乎并没有真正起作用(无论如何我每次都必须创建一个单独的 canvas 元素来促进这一点。)

我想知道是否有一种方法可以使用 drawImage 将位图的缩减采样版本直接绘制到 createjs Bitmap 实例中,而无需通过单独的 canvas 对象或者转换成字符串?

如果我理解正确,在内部这就是 createjs cache 属性 的工作方式(即在内部使用 drawImage 写入 DisplayObject)但我无法弄清楚自己怎么用。

您已使用 createjseaseljs 标记此 post,但您的示例显示了用于缩放的简单 Canvas 上下文用法。

您可以在 Bitmap.cache() 上使用 scale 参数来获得您想要的结果,然后根据需要重复使用 cacheCanvas

// This will create a half-size cache (50%)
// But scale it back up for you when it displays on the stage
var bmp = new createjs.Bitmap(img);
bmp.cache(0, 0, img.width, img.height, 0.5);

// Pull out the generated cache and use it in a new Bitmap
// This will display at the new scaled size.
var bmp2 = new createjs.Bitmap(bmp.cacheCanvas);

// Un-cache the first one to reset it if you want
bmp.uncache();

这里有一个 fiddle 可以看到它的实际效果:http://jsfiddle.net/lannymcnie/ofdsyn7g/

请注意,缓存只是使用另一个 canvas 和 drawImage 来缩小它。我肯定会远离 toDataURL,因为它根本没有性能。