我有一个带有位图的ImageView。此位图具有Alpha通道和透明像素。 当我尝试使用ColorFiter与Mode.OVERLAY(自蜂窝) - 提供颜色覆盖整个imageview(整个矩形),但我只想覆盖非透明像素。如何剪切imageview的画布以执行我想要的过滤器?
已更新
我在png中有灰色图像:
当我尝试使用MODE_ATOP时,我得到:
当我使用OVERLAY时,我得到:
我想得到的是什么:
答案 0 :(得分:3)
可能有一种更有效的方法(可能通过创建ColorMatrixColorFilter
来近似它),但由于Mode.OVERLAY
似乎是hard to simplify otherwise,这里有一些应该实现的示例代码你想要什么:
public class MyActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
final ImageView imageView = new ImageView(this);
setContentView(imageView);
final Paint paint = new Paint();
Canvas c;
final Bitmap src = BitmapFactory.decodeResource(getResources(),
android.R.drawable.sym_def_app_icon);
final int overlayColor = Color.RED;
final Bitmap bm1 = Bitmap.createBitmap(src.getWidth(), src.getHeight(), Config.ARGB_8888);
c = new Canvas(bm1);
paint.setColorFilter(new PorterDuffColorFilter(overlayColor, PorterDuff.Mode.OVERLAY));
c.drawBitmap(src, 0, 0, paint);
final Bitmap bm2 = Bitmap.createBitmap(src.getWidth(), src.getHeight(), Config.ARGB_8888);
c = new Canvas(bm2);
paint.setColorFilter(new PorterDuffColorFilter(overlayColor, PorterDuff.Mode.SRC_ATOP));
c.drawBitmap(src, 0, 0, paint);
paint.setColorFilter(null);
paint.setXfermode(new AvoidXfermode(overlayColor, 0, Mode.TARGET));
c.drawBitmap(bm1, 0, 0, paint);
imageView.setImageBitmap(bm2);
}
}
简而言之,我们使用OVERLAY
模式绘制源位图和颜色,然后使用辅助位图(使用SRC_ATOP
模式合成),我们使用AvoidXfermode
将其合并到画在透明像素上。
原始图片:
结果:
答案 1 :(得分:0)
您可以使用“覆盖”模式,然后使用DST_ATOP xFerMode裁剪具有相同位图的透明区域。 https://developer.android.com/reference/android/graphics/PorterDuff.Mode
private fun applyFilterToImage() {
val bitmapCopy = Bitmap.createBitmap(originalImage.width, originalImage.height, Bitmap.Config.ARGB_8888)
val canvas = Canvas(bitmapCopy)
val rnd = java.util.Random()
val randomColor = Color.rgb(rnd.nextInt(256), rnd.nextInt(256), rnd.nextInt(256))
val paint = Paint()
val porterDuffMode = PorterDuff.Mode.OVERLAY
paint.colorFilter = PorterDuffColorFilter(randomColor, porterDuffMode)
val maskPaint = Paint()
maskPaint. xfermode = PorterDuffXfermode(PorterDuff.Mode.DST_ATOP)
canvas.drawBitmap(originalImage, 0f, 0f, paint)
canvas.drawBitmap(originalImage, 0f, 0f, maskPaint) //clips out the background that used to be transparent.
imageView.setImageBitmap(bitmapCopy)
}