如何以百分比计算画布的透明区域?

Posted

技术标签:

【中文标题】如何以百分比计算画布的透明区域?【英文标题】:How to calculate transparent area of canvas in percentage? 【发布时间】:2020-03-08 06:10:31 【问题描述】:

我正在 Ionic 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 上添加的code sample,这里是live Demo。

【问题讨论】:

我不确定我是否理解您的问题;但是,根据github.com/gokujy/ioniccanvas.github.io/blob/… isTransparent 将始终为false,因为您在调用isTransparent 之前 在同一坐标处绘制笔划(第84 行)。 【参考方案1】:

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

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

var canvas = document.getElementById('id_of_the_canvas');

2) 检索drawing context

var ctx = canvas.getContext('2d');

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

var imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);

4) 决定在哪一点您认为像素透明(透明度阈值)并计算透明和非透明像素之间的比率,使用imageData.data 进行更快的计算:

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;

此操作是计算密集型的,因此请选择好何时执行它:自上次绘图操作后经过一段时间后(绘图期间debounce)或绘图期间定期(绘图期间throttle)。

【讨论】:

以上是关于如何以百分比计算画布的透明区域?的主要内容,如果未能解决你的问题,请参考以下文章

如何在photoshop javascript中定义百分比画布增加

如何将百分比宽度放入 html 画布(无 css)

画布更改宽度取决于完成百分比

Android 透明度百分比对应的 十六进制

Android 透明度百分比对应的 十六进制

rgba()如何知道RGB颜色是由哪个RGB值经过百分之三十透明过来的?有计算方法吗?