本文共 2151 字,大约阅读时间需要 7 分钟。
原文地址:
博客地址:xiazdong.github.io
马赛克算法首先需要确定马赛克单元的大小,即小方块的大小。马赛克图的每个马赛克单元都是纯色的块,其取值一般为原图中该块区域的颜色的均值(这里的实现为了简化,取了原图中该区域左上角的像素)。马赛克单元的大小决定了最后的马赛克图的样子,当值为1时,就是原图。
上图中,最左边的图是原图,中间的图是马赛克图。当然你也可以对图像的某块区域打马赛克,如最右边的图,他只对头部打马赛克。
算法实现如下:
public class PixelateUtil { / 普通图像->像素图,zoneWidth为像素图的大像素的宽度 / public static Bitmap pixelate(Bitmap bitmap, int zoneWidth) { return pixelate(bitmap, zoneWidth, 0, 0, bitmap.getWidth(), bitmap.getHeight()); } / 普通图->像素图,left、top、right、bottom可指定打马赛克区域 / public static Bitmap pixelate(Bitmap bitmap, int zoneWidth, int left, int top, int right, int bottom) { int w = bitmap.getWidth(); int h = bitmap.getHeight(); Bitmap result = bitmap.copy(Bitmap.Config.ARGB_8888, true); Canvas canvas = new Canvas(result); Paint paint = new Paint(); for (int i = left; i < right; i += zoneWidth) { for (int j = top; j < bottom; j += zoneWidth) { int color = bitmap.getPixel(i, j); paint.setColor(color); int gridRight = Math.min(w, i + zoneWidth); int gridBottom = Math.min(h, j + zoneWidth); canvas.drawRect(i, j, gridRight, gridBottom, paint); } } return result; }}
使用方法:
Bitmap result = PixelateUtil.pixelate(bitmap, zoneWidth); //对全图打马赛克Bitmap result = PixelateUtil.pixelate(bitmap, zoneWidth, left, top, right, bottom); //对指定区域打马赛克
是实现基本马赛克效果的开源项目,它能够异步对整个或者部分的Bitmap区域打马赛克,处理完后会在OnPixelateListener的onPixelated()中回调,最小的SDK版本为16。
使用方法如下:
new Pixelate(origin) .setArea(0,0,origin.getWidth(),origin.getHeight()) //设置区域 .setDensity(12) //值越大,马赛克单元越小 .setListener(new OnPixelateListener() { @Override public void onPixelated(Bitmap bitmap, int density) { //bitmap为马赛克图 Log.v(TAG, ""); } }) .make();
能够实现多样式的马赛克效果。使用方法如下:
Bitmap pixelated = Pixelate.fromBitmap( origin, new PixelateLayer.Builder(PixelateLayer.Shape.Circle) //设置马赛克形状 .setResolution(30) //每个像素的密度(如果该值和size值一样,那么圆形之间相邻) .setSize(30) //圆圈的大小 .build());
效果如下:
转载地址:http://xpfqb.baihongyu.com/