【发布时间】:2015-12-10 15:00:35
【问题描述】:
我正在尝试对从canvas 检索到的一些ImageData 应用透明度。很简单,对吧?只需为每四个数据点设置一个适当的值......仅,它似乎只适用于没有预先存在的 alpa 值的像素。
//create 2 canvases
var canvas = document.createElement("canvas");
document.body.appendChild(canvas);
var ctx = canvas.getContext("2d");
canvas.id = "tempCanvas";
var canvas2 = document.createElement("canvas");
document.body.appendChild(canvas2);
var ctx2 = canvas2.getContext("2d");
canvas2.id = "tempCanvas2";
//draw the png in the first canvas
var testimg = document.getElementById("testimg");
ctx.drawImage(testimg, 0, 0, 200, 200);
//helper function to opacity to the pixels
opacity = function(pixels, value){
var d = pixels.data;
for(var i=0;i<d.length;i+=4){
d[i+3] = value*255; //scale by 255
if(d[i+3] > 255) d[i+3] = 255; //clamp
}
return pixels;
}
//make the first canvas' image data opaque
var data = ctx.getImageData(0,0,200,200);
data = opacity(data, 0.5);
//draw to second canvas
ctx2.fillStyle="#900";
ctx2.fillRect(0,0,200,200);
//should get a jsfiddle logo overlayed on red background
//instead, get yucky grey background
ctx2.putImageData(data, 0, 0);
(由于同源策略,复制有点困难,但这里有一个使用 png jsfiddle 徽标的小提琴:http://jsfiddle.net/97c0eetr/)
为什么这种不透明度算法不适用于 jsfiddle 徽标(以及我在 http://localhost 上测试的其他透明 png)?
编辑:FF42 Ubuntu,如果它有所作为的话。
【问题讨论】:
标签: javascript html canvas transparency