HTML canvas,使用灰度图像作为遮罩
HTML canvas, use greyscale image as mask
我正尝试在 Photoshop 中应用蒙版。黑色是透明的,白色是可见的。但是,我认为复合模式不允许这样做。
我只能找到使用 alpha 通道的模式,但我想使用 jpg 来获得较小的文件大小...
使用 getImageData 和 putImageData 访问原始像素数据
您需要手动移动像素。
为此加载图像,将其放到 canvas 上,获得 canvas 像素。转换为灰度并移动到 alpha。然后将像素放回 canvas.
var mask;
var image = new Image;
image.src = "image name.jpg";
image.onload = function(){
var canvas = document.createElement("canvas");
canvas.width = this.width;
canvas.height = this.height;
var ctx = canvas.getContext("2d");
ctx.drawImage(this,0,0);
var data = ctx.getImageData(0,0,this.width,this.height);
var i = 0;
while(i < data.data.length){
var rgb = data.data[i++] + data.data[i++] + data.data[i++];
data.data[i ++] = rgb / 3;
}
ctx.putImageData(data,0,0);
mask = canvas;
}
加载蒙版后,Alpha 通道图像的副本包含 RGB 通道的平均值。
使用它
// ctx is the canvas context you want to draw to with the mask
if(mask){
ctx.globalCompositeOperation = "destination-out";
ctx.drawImage(mask,0,0);
ctx.globalCompositeOperation = "source-over";
}
我尝试 运行 你的代码,但不幸的是它没有按预期工作。
我也想要这个方案。谁能修好?
window.onload = function() {
var img = document.getElementById("img");
var canvas = document.getElementById("c");
var ctx = canvas.getContext("2d");
canvas.width = img.naturalWidth;
canvas.height = img.naturalHeight;
ctx.drawImage(img, 0, 0);
var idata = ctx.getImageData(0, 0, canvas.width, canvas.height);
var data32 = new Uint32Array(idata.data.buffer);
var i = 0, len = data32.length;
while(i < len) {
var rgb = idata.data[i++] + idata.data[i++] + idata.data[i++];
idata.data[i ++] = rgb / 3;
}
ctx.putImageData(idata, 0, 0)
}
<img id="img" crossorigin="anonymous" src="https://i.imgur.com/QRGYuWg.png"> ►
<canvas id="c"></canvas>
我正尝试在 Photoshop 中应用蒙版。黑色是透明的,白色是可见的。但是,我认为复合模式不允许这样做。
我只能找到使用 alpha 通道的模式,但我想使用 jpg 来获得较小的文件大小...
使用 getImageData 和 putImageData 访问原始像素数据
您需要手动移动像素。
为此加载图像,将其放到 canvas 上,获得 canvas 像素。转换为灰度并移动到 alpha。然后将像素放回 canvas.
var mask;
var image = new Image;
image.src = "image name.jpg";
image.onload = function(){
var canvas = document.createElement("canvas");
canvas.width = this.width;
canvas.height = this.height;
var ctx = canvas.getContext("2d");
ctx.drawImage(this,0,0);
var data = ctx.getImageData(0,0,this.width,this.height);
var i = 0;
while(i < data.data.length){
var rgb = data.data[i++] + data.data[i++] + data.data[i++];
data.data[i ++] = rgb / 3;
}
ctx.putImageData(data,0,0);
mask = canvas;
}
加载蒙版后,Alpha 通道图像的副本包含 RGB 通道的平均值。
使用它
// ctx is the canvas context you want to draw to with the mask
if(mask){
ctx.globalCompositeOperation = "destination-out";
ctx.drawImage(mask,0,0);
ctx.globalCompositeOperation = "source-over";
}
我尝试 运行 你的代码,但不幸的是它没有按预期工作。
我也想要这个方案。谁能修好?
window.onload = function() {
var img = document.getElementById("img");
var canvas = document.getElementById("c");
var ctx = canvas.getContext("2d");
canvas.width = img.naturalWidth;
canvas.height = img.naturalHeight;
ctx.drawImage(img, 0, 0);
var idata = ctx.getImageData(0, 0, canvas.width, canvas.height);
var data32 = new Uint32Array(idata.data.buffer);
var i = 0, len = data32.length;
while(i < len) {
var rgb = idata.data[i++] + idata.data[i++] + idata.data[i++];
idata.data[i ++] = rgb / 3;
}
ctx.putImageData(idata, 0, 0)
}
<img id="img" crossorigin="anonymous" src="https://i.imgur.com/QRGYuWg.png"> ►
<canvas id="c"></canvas>