近日,在开发拼接图片中实现剪切图片并把背景色设为透明,在此分享一下实现的方法
首先为确保颜色去除后变成透明,图片质量必须是Config.ARGB_4444,或者Config.ARGB_8888,通过以下方法对资源图进行转换
bmp = bmp.copy(Bitmap.Config.ARGB_8888, true);然后就可以进行过滤了,代码如下:
Canvas c = new Canvas(bmp); Paint p = new Paint(); p.setAlpha(0); p.setXfermode(new AvoidXfermode(removeColor, 0, AvoidXfermode.Mode.TARGET)); c.drawPaint(p); return bmp;
关于setXfermode()方法的用法可参考http://yueguc.iteye.com/blog/782109
转换后再对资源图通过以下方法进行剪切,以获取我们所需的图块
Bitmap tileImg = Bitmap.createBitmap(sourceImg, xIndex, yIndex, set.tileWidth, set.tileHeight);然而,在图块剪切出来后,我们却发现这不是我们想要的效果,背景色变成黑色,而不是透明的。
通过测试发现
Bitmap.createBitmap(sourceImg, xIndex, yIndex, set.tileWidth, set.tileHeight);不论资源图是多少位,创建的图片会被转换成RGB_565,所以不支持透明通道。
在网上检索中发现了另外一种剪切方法,该方法能保留原图的质量
public static Bitmap cutBitmap(Bitmap mBitmap, Rect r, Bitmap.Config config) { int width = r.width(); int height = r.height(); Bitmap croppedImage = Bitmap.createBitmap(width, height, config); Canvas canvas = new Canvas(croppedImage); Rect dr = new Rect(0, 0, width, height); canvas.drawBitmap(mBitmap, r, dr, null); return croppedImage; }
最后验证该方法可行。如果有其它实现方式,欢迎留言交流心得!