markE の回答のオプションとして、アルファ チャネルを直接スケーリングすることができます。
このアプローチは、前処理段階の一部としてのみお勧めします。この方法でバッファを反復処理するのは比較的遅いプロセスであるため、スプライトを使用する必要があるたびに使用することはお勧めしません。
ライブデモはこちら
すでにキャンバスにスプライトがあり、その位置がわかっていると仮定します。
/// get the image data and cache its pixel buffer and length
var imageData = context.getImageData(x, y, width, height);
var data = imageData.data;
var length = data.length;
var i = 0;
var scale = 4; /// scale values 4 times. This may be a fractional value
/// scale only alpha channel
for(; i < length; i += 4) {
data[i + 3] *= scale;
}
context.putImageData(imageData, x, y);
キャンバスが使用している の良い点はUint8ClampedArray
、値をクランプして丸めるので、下限または上限をチェックしたり、値を整数に変換したりする必要がありません。内部コードがこれらすべてを行います。