Javascript 如何以百分比计算画布的透明面积?

Javascript 如何以百分比计算画布的透明面积?,javascript,angularjs,image,ionic-framework,html5-canvas,Javascript,Angularjs,Image,Ionic Framework,Html5 Canvas,我正在爱奥尼亚4中制作一个绘图应用程序,在这个应用程序中,我使用drawImage在画布中添加了1号图像,其余的图像背景是透明的。如果用户(孩子)在1号图像之外绘制,百分比将降低。为此,我搜索但没有找到任何东西,但我发现点击查找像素是否透明 isTransparent(x, y) { // x, y coordinate of pixel let alpha = this.ctx.getImageData(x, y, 1, 1).data[3]; // 3rd byte is alpha if

我正在爱奥尼亚4中制作一个绘图应用程序,在这个应用程序中,我使用drawImage在画布中添加了1号图像,其余的图像背景是透明的。如果用户(孩子)在1号图像之外绘制,百分比将降低。为此,我搜索但没有找到任何东西,但我发现点击查找像素是否透明

isTransparent(x, y) { // x, y coordinate of pixel
let alpha = this.ctx.getImageData(x, y, 1, 1).data[3]; // 3rd byte is alpha

if (alpha === 0) {
  this.accuracy = 0;
  console.log("Transparent image clicked!");
} else {
  this.accuracy = 100;
  console.log("image clicked!");
}
}

我在GitHub上添加了一个示例,如下所示。

为此,您需要一个对画布的引用,一个对该画布的绘图上下文的引用,并选择何时更新百分比:

1) 检索画布(例如使用):

2) 取回

3) 检索(所有图像数据)

4)决定在哪一点考虑像素透明(透明阈值),计算透明和非透明像素之间的比率,用于更快的计算:

var pixelCount = canvas.width * canvas.height;
var arrayElemsCount = pixelCount * 4; // for components (rgba) per pixel.
var dataArray = imageData.data;
// 0 is completely transparent, set to 0.5 to
// allow for instance semi transparent pixels to be accounted for
var threshold = 0;
var transparentPixelCount = 0;
// remember fourth (index = 3) byte is alpha
for (var i = 3; i < arrayElemsCount; i+= 4) {
    var alphaValue = dataArray[i];
    if (alphaValue <= threshold) {
        transparentPixelCount++;
    }
}
var transparencyPercentage = (transparentPixelCount / pixelCount) * 100;
var pixelCount=canvas.width*canvas.height;
var arrayElemsCount=pixelCount*4;//对于每个像素的组件(rgba)。
var dataArray=imageData.data;
//0是完全透明的,设置为0.5到
//例如,允许考虑半透明像素
var阈值=0;
var transparentPixelCount=0;
//记住第四个(索引=3)字节是alpha
对于(变量i=3;i如果(alphaValue,则需要对画布的引用,对该画布的绘图上下文的引用,并选择何时更新百分比:

1) 检索画布(例如使用):

2) 取回

3) 检索(所有图像数据)

4)决定在哪一点考虑像素透明(透明阈值),计算透明和非透明像素之间的比率,用于更快的计算:

var pixelCount = canvas.width * canvas.height;
var arrayElemsCount = pixelCount * 4; // for components (rgba) per pixel.
var dataArray = imageData.data;
// 0 is completely transparent, set to 0.5 to
// allow for instance semi transparent pixels to be accounted for
var threshold = 0;
var transparentPixelCount = 0;
// remember fourth (index = 3) byte is alpha
for (var i = 3; i < arrayElemsCount; i+= 4) {
    var alphaValue = dataArray[i];
    if (alphaValue <= threshold) {
        transparentPixelCount++;
    }
}
var transparencyPercentage = (transparentPixelCount / pixelCount) * 100;
var pixelCount=canvas.width*canvas.height;
var arrayElemsCount=pixelCount*4;//用于每个像素的组件(rgba)。
var dataArray=imageData.data;
//0是完全透明的,设置为0.5到
//例如,允许考虑半透明像素
var阈值=0;
var transparentPixelCount=0;
//记住第四个(索引=3)字节是alpha
对于(变量i=3;i如果(alphaValue),我不确定我是否理解您的问题;但是,根据
isTransparent
,它将始终是
false
,因为您绘制了笔划(第84行)调用
isTransparent
之前在同一坐标处。我不确定是否理解您的问题;但是,根据
isTransparent
,isTransparent将始终为
false
,因为您在调用
isTransparent
之前在同一坐标处绘制笔划(第84行)。
var imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
var pixelCount = canvas.width * canvas.height;
var arrayElemsCount = pixelCount * 4; // for components (rgba) per pixel.
var dataArray = imageData.data;
// 0 is completely transparent, set to 0.5 to
// allow for instance semi transparent pixels to be accounted for
var threshold = 0;
var transparentPixelCount = 0;
// remember fourth (index = 3) byte is alpha
for (var i = 3; i < arrayElemsCount; i+= 4) {
    var alphaValue = dataArray[i];
    if (alphaValue <= threshold) {
        transparentPixelCount++;
    }
}
var transparencyPercentage = (transparentPixelCount / pixelCount) * 100;