具有透明区域的Android位图

时间:2012-11-05 17:16:54

标签: android bitmap

如何在Android上使用PNG图像将多边形(由一组点指定)设置为透明?

1 个答案:

答案 0 :(得分:2)

为了实现这一目标,您必须首先从BitmapFactory获取对资源的引用:

Bitmap my_image = BitmapFactory.decodeResource(getResources(), R.drawable.[your_image]);

然后,您必须使用setPixels()方法在PNG上定义要透明的区域。我相信透明度是通过将像素Color设置为0来实现的。

派生多边形将是您在应用程序中必须进行的一些计算,然后将多边形的尺寸传递到setPixels()方法。有关如何使用setPixels()方法的建议,请参阅Android开发人员文档中的this link

请注意,这假设您的PNG文件可变。否则你将获得IllegalStateException


导出N面多边形的面积

这是您的问题变得更具挑战性的地方。由于您不能使用传统的区域公式(因为该区域与此示例无关,而是与顶点所在的位置无关),您必须找到一种方法来计算必须自己透明的区域。

我可以想到这样做的一种方法是测试用户绘制线的一部分下方的所有像素,并将它们标记为透明直到满足交叉点,并重复此操作直到达到图像的底部。请参阅此图以供参考:

enter image description here

这里的ΔX是任意定义的像素长度,可以增加以提高精度,或者减小以提高性能。推导出这种透明度的过程如下:

  1. 获取最左边的值,该值是用户绘制的顶点的一部分;
  2. 向下移动图片(通过降低Y方法中getPixel()的值,直到您与另一个用户绘制的顶点发生碰撞,在使用setPixel()时将像素更改为透明并传递你当前的坐标;
  3. 当您与另一个顶点发生碰撞时,请停止更改像素的透明度,但继续以解析该列;
  4. 同样,如果到达另一个顶点,则开始将以下像素标记为透明;
  5. 重复此操作,直至到达图像的底部;
  6. 将X值增加预定义的常数ΔX,并在下一列重复此操作。
  7. 请注意,在设置透明度和不设置透明度之间切换是很重要的(您可以使用boolean来维持状态),因为多边形可以“弯曲”并返回到您要解析的列。