您是否知道任何好的解决方案(也可以基于画布),使开发人员能够在非透明区域(如蒙版)中更改 png 图像的颜色(用十六进制颜色填充)?我需要可以改变颜色(或背景图像)的透明区域,这就是为什么它必须保持不变。
问问题
1938 次
4 回答
2
要做你想做的事,你需要使用getImageData
并putImageData
查看mdn 以获得关于像素操作的解释。
这是一些示例代码
var canvas = document.getElementById("canvas"),
ctx = canvas.getContext("2d"),
image = document.getElementById("testImage");
canvas.height = canvas.width = 135;
ctx.drawImage(image,0,0);
var imgd = ctx.getImageData(0, 0, 135, 135),
pix = imgd.data,
newColor = {r:0,g:100,b:200};
for (var i = 0, n = pix.length; i <n; i += 4) {
var r = pix[i],
g = pix[i+1],
b = pix[i+2];
if(r == 216 && g == 6 && b == 6){
// Change the red to whatever.
pix[i] = newColor.r;
pix[i+1] = newColor.g;
pix[i+2] = newColor.b;
}
}
ctx.putImageData(imgd, 0, 0);
使用上面的代码,您可以使用
if(r == 255 && g == 0 && b == 255)
然后只需更改newColor
为替换颜色。
于 2012-06-04T15:10:49.257 回答
1
您可以使用<canvas>
原始像素访问进行像素操作
读取像素
检查它是否满足条件(不透明,alpha = 0)
用纯色替换像素
https://developer.mozilla.org/En/HTML/Canvas/Pixel_manipulation_with_canvas的像素操作资源<canvas>
于 2012-06-04T08:45:00.560 回答
1
您可以使用所需颜色填充图像/区域,然后在其上绘制 png。
于 2012-06-04T15:23:51.730 回答
0
画布 API 具有诸如“仅在原始图像中不透明的像素上绘制”之类的合成方法。这比处理图像数据更快,也避免了原始权限问题。
代码笔示例
您想要的复合操作是source-in
. 画布仅在红色矩形和透明 PNG 重叠的地方涂成红色。其他一切都变得透明。
HTML:
<canvas id="canvas" width="800" height="400"></canvas>
<a href="javascript:paintNontransparent()">paint non-transparent regions red</a><br>
Javascript:
var color = '#FF0000';
var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d');
var textureURL = 'http://i.imgur.com/LWHZV8v.png';
var textureIMG = new Image();
textureIMG.src = textureURL;
textureIMG.onload = function(){
canvas.width = textureIMG.width;
canvas.height = textureIMG.height;
ctx.drawImage(textureIMG,0,0);
};
window.paintNontransparent = function() {
ctx.globalCompositeOperation = "source-in";
ctx.fillStyle = color;
ctx.fillRect(0, 0, canvas.width, canvas.height);
}
于 2015-05-19T16:17:57.047 回答