3

因此 createImageRegion 方法会忽略所有具有少量 alpha/opacity 的像素。

您如何制作此功能,以便不透明度为 0.5 或其他像素的像素也将被计算为命中检测?

我研究了 KineticJS。一个 colorKey 被添加到一个 hitregion,但它把键转换为一个没有 alpha 的十六进制键。我想不出一种方法来完成这项工作。

非常感谢您的帮助!

这就是魔法发生的地方。但我不明白我怎么能包含任何类型的透明度但 0 的像素

createImageHitRegion: function (callback) {
    var canvas = new Kinetic.Canvas(this.attrs.width, this.attrs.height);
    var context = canvas.getContext();
    context.drawImage(this.attrs.image, 0, 0);
    try {
        var imageData = context.getImageData(0, 0, canvas.getWidth(), canvas.getHeight());
        var data = imageData.data;
        var rgbColorKey = Kinetic.Type._hexToRgb(this.colorKey);
        // replace non transparent pixels with color key
        for (var i = 0, n = data.length; i < n; i += 4) {
            data[i] = rgbColorKey.r;
            data[i + 1] = rgbColorKey.g;
            data[i + 2] = rgbColorKey.b;
            // i+3 is alpha (the fourth element)
        }

        var that = this;
        Kinetic.Type._getImage(imageData, function (imageObj) {
            that.imageHitRegion = imageObj;
            if (callback) {
                callback();
            }
        });
    }
    catch (e) {
        Kinetic.Global.warn('Unable to create image hit region. ' + e.message);
    }
}

当我包括: data[i + 3] = 255 (rgbColorKey.a) 不存在时,所有图像事件都不再起作用

4

1 回答 1

2

我找到了答案:

       for (var i = 0, n = data.length; i < n; i += 4) {
            data[i] = rgbColorKey.r;
            data[i + 1] = rgbColorKey.g;
            data[i + 2] = rgbColorKey.b;
            if (!ignoreAlpha && data[i + 3] > 0) {
                data[i + 3] = 255;
            }
        }

这样,每个留下一点透明度的像素都会得到全彩色。因此,如果您将其原型化为 kinetixJS,它应该可以工作:

Kinetic.Image.prototype.createImageHitRegion = function (callback, ignoreTransparantPixels) {
var canvas = new Kinetic.Canvas(this.attrs.width, this.attrs.height);
var context = canvas.getContext();
var _ignoreTransparantPixels;
if(typeof ignoreTransparantPixels == 'undefined'){
    _ignoreTransparantPixels = false;
}

context.drawImage(this.attrs.image, 0, 0);

try {
    var imageData = context.getImageData(0, 0, canvas.getWidth(), canvas.getHeight());
    var data = imageData.data;

    var rgbColorKey = Kinetic.Type._hexToRgb(this.colorKey);
    // replace non transparent pixels with color key
    for (var i = 0, n = data.length; i < n; i += 4) {
        data[i] = rgbColorKey.r;
        data[i + 1] = rgbColorKey.g;
        data[i + 2] = rgbColorKey.b;
        if (!_ignoreTransparantPixels && data[i + 3] > 0) {
            data[i + 3] = 255;
        }

        //trace(data[i + 3]);
        // i+3 is alpha (the fourth element)
    }

    var that = this;
    Kinetic.Type._getImage(imageData, function (imageObj) {
        that.imageHitRegion = imageObj;
        if (callback) {
            callback();
        }
    });
}
catch (e) {
    Kinetic.Global.warn('Unable to create image hit region. ' + e.message);
}

}

于 2012-12-14T15:39:54.847 回答