Android和从位图中裁剪(删除)形状

6
如何从位图中切割(删除)一个部分? 我想让该部分/形状被删除.. 在删除的位置留下透明.. 假设形状是圆形或正方形。 enter image description here enter image description here

你想在代码中实现这个吗?你尝试过什么了吗? - Ted Hopp
我还不知道怎么做(这就是为什么我有StackOverflow账户的原因)..到目前为止,我只使用过图像合成..而且是Java代码..想在一些Android应用中使用它。 - pulancheck1988
线性代数。我无法提供代码,但我知道这是一个简单的代数/几何问题。您可以从触摸事件中获取指标,形成一个整数数组,对应于用户的触摸和拖动。然后使用该数组从位图中删除相同大小和形状的区域。 - Ryan Gray
只需在画布上绘制一个清晰的圆形即可。简单易行。 - IAmGroot
3个回答

11

你应该可以使用 Porter-Duff 颜色过滤器和 Canvas 实现这个功能:

public void punchHole(Bitmap bitmap, float cx, float cy, float radius) {
    Canvas c = new Canvas(bitmap);
    Paint paint = new Paint();
    paint.setColorFilter(new PorderDuffColorFilter(0, PorderDuff.Mode.CLEAR));
    c.drawCircle(cx, cy, radius, paint);
}

嗯,那样是错误的。然而,使用 Porter-Duff 转移模式确实可以起作用:

public void punchHole(Bitmap bitmap, float cx, float cy, float radius) {
    Canvas canvas = new Canvas(bitmap);
    Paint paint = new Paint();
    paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
    canvas.drawCircle(cx, cy, radius, paint);
}

(传递的位图参数需要是可修改的。)


1
什么都没发生:我尝试了所有模式,从android.graphics.PorterDuff.Mode.CLEAR到最后一个.. 没有好的结果.. 对于CLEAR实际上什么都没有发生.. 对于其他一些模式,我最终得到了一个黑色的圆形。 - pulancheck1988
我又Google了一下,发现 "AlphaComposite.CLEAR:不会在合并的图像中绘制任何内容"。所以扣分了:P - pulancheck1988
@pulancheck1988 - 这很奇怪。我得检查一下。根据Android文档PorderDuff.Mode.CLEAR应该产生颜色0和透明度0作为输出。这个答案似乎证实它在Android中确实会表现出这种方式。AlphaComposite.CLEAR的JavaDocs也说了同样的事情。 - Ted Hopp
@pulancheck1988 - 好的,就像你说的,Porter-Duff颜色过滤器不起作用。但是,使用PorterDuffXferMode可以起作用。我更新了我的回答,展示所需的代码。 - Ted Hopp
我无法让 paint.setXferMode(new PorterDuffXferMode(PorterDuff.Mode.CLEAR)); 生效。1)我将背景布局设置为明亮的绿色。2)在我的自定义视图类中,我将使用 Mode.Clear 的 paint 来“切割”矩形。3)结果是我的矩形位于明亮的绿色背景上,所有应该从矩形中切割出来的形状都显示为纯黑色!(我期望背景绿色能够“透过”那些应该被切割出来的区域。 :-( - Someone Somewhere
@SomeoneSomewhere - 我需要了解更多关于你正在做的事情的细节。我认为你可以做的最好的事情是创建一个单独的问题,并展示所有相关的代码,解释你期望它执行什么操作(你可以引用这个线程来澄清),并描述(也许附上一张图片)发生了什么。 - Ted Hopp

0
使用Bitmap.setPixel(x,y,Color)函数将所需像素设置为透明。
例如:
Bitmap bmp = ...;
bmp.setPixel (100,100,Color.TRANSPARENT);

对于偏移量为100,100的像素。虽然在许多像素上执行此操作可能会潜在地变慢...


哈..这个可以用..在一个20x30的矩形上测试过了..但肯定已经有现成的方法了,所以我不需要直接计算像素。 - pulancheck1988
如果尝试了所有填充类型和操作组合:Path p1 = new Path(); p1.setFillType(FillType.WINDING); p1.addCircle(60, 60, 20, Direction.CCW); canvas.clipPath(p1, Op.INTERSECT); ...但什么也没有发生 - pulancheck1988

0
你尝试过用透明颜色绘制一个圆形吗,ARGB = 0,0,0,0?

透明的颜色涂上去不会有任何效果。 - Someone Somewhere

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接