【问题标题】:Android & cut (remove) shape from bitmapAndroid & 从位图中剪切(删除)形状
【发布时间】:2012-07-30 17:39:58
【问题描述】:

如何从位图中剪切(删除)一个部分??? 我希望删除该部分/形状..保留透明代替部分.. 说形状是圆形或方形..

【问题讨论】:

  • 您想在代码中执行此操作吗?你试过什么?
  • 我不知道怎么做(但..这就是为什么我有 stackoverflow 帐户).. 到目前为止我只使用了图像合成.. 是的 Java 代码..想在一些 android 应用程序中使用它
  • 线性代数。我无法为您提供代码,但我知道这是一个简单的代数/几何问题。您可以从触摸事件中获取指标,以形成与用户触摸和拖动相对应的整数数组。然后使用该数组从位图中删除相同大小和形状的区域。
  • 在画布上画一个清晰的圆圈。简单

标签: android graphics bitmap


【解决方案1】:

你应该可以使用 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);
}

(当然,作为 arg 传递的位图需要是可修改的。)

【讨论】:

  • 什么都没发生:我测试了所有模式,从 android.graphics.PorterDuff.Mode.CLEAR 到最后一个.. & 没有好的结果.. 对于 CLEAR 实际上什么也没发生.. 对于某些其他模式我最终会得到一个黑色圆圈。
  • 做了更多的谷歌搜索和“AlphaComposite.CLEAR:组合图像中不会绘制任何内容”.. 所以扣分:P
  • @pulancheck1988 - 这很奇怪。我得去看看。根据Android docsPorderDuff.Mode.CLEAR 应该产生颜色 0 和 alpha 0 作为输出。 This answer 似乎证实它确实会在 Android 中以这种方式运行。 JavaDocs for AlphaComposite.CLEAR 说了同样的话。
  • @pulancheck1988 - 好的,就像你说的,Porter-Duff 彩色滤镜不起作用。但是,使用 PorterDuffXferMode 确实有效。我更新了答案以显示所需的代码。
  • 我无法让paint.setXferMode(new PorterDuffXferMode(PorterDuff.Mode.CLEAR)); 工作。 1)我将背景布局设置为亮绿色。 2) 在我的自定义 View 类中,我将使用带有 Mode.Clear 的绘图从矩形中“剪切形状”。 3)结果是我的矩形位于明亮的绿色背景上,所有应该从矩形中剪下来的形状都显示为黑色! (我希望背景绿色“照亮”应该被剪掉的区域。:-(
【解决方案2】:

使用 Bitmap.setPixel(x,y,Color) 函数将所需像素设置为透明

例如:

Bitmap bmp = ...;
bmp.setPixel (100,100,Color.TRANSPARENT);

对于 x/y 偏移 100,100 处的像素。尽管您会发现在许多像素上执行此操作可能会很慢...

【讨论】:

  • 哈..这工作..在矩形 20x30 上测试过..但肯定有一些东西已经存在所以我不直接对像素进行数学计算..
  • 如果尝试使用 FillType 和 Op 的所有组合:Path p1 = new Path(); p1.setFillType(FillType.WINDING); p1.addCircle(60, 60, 20, Direction.CCW); canvas.clipPath(p1, Op.INTERSECT); ...什么都没有
【解决方案3】:

你试过用透明颜色画一个圆吗? ARGB = 0,0,0,0 ?

【讨论】:

  • 没错,用透明色画是没有效果的。
猜你喜欢
  • 1970-01-01
  • 2017-07-05
  • 2016-08-17
  • 2023-02-24
  • 2018-09-30
  • 1970-01-01
  • 2020-01-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多