自己写个小程序,需求图片转马赛克.
protected Bitmap mosic(Bitmap bitmap){ int bitWidth = bitmap.getWidth(); int bitHeight = bitmap.getHeight(); int mosicArea = 50;//马赛克范围 /* * 第一版 * 逻辑: * 如果mosicArea = 50 * 则第一个像素块 50*50范围内都用[0,0]的颜色,第二个像素块用 [50,0]的颜色 ,以此类推 * 实验了一下,效率不高,手机有点卡死的感觉,但最终还是出得来 */ for(int i=0;i<bitWidth;i++){ for(int j=0;j<bitHeight;j++){ int x = i/mosicArea * mosicArea;//整除后再定位需求的那个像素 int y = j/mosicArea * mosicArea; int iPixel = bitmap.getPixel(x,y); bitmap.setPixel(i, j, iPixel); } } return bitmap; }
class CustomView extends View{ //第二版 //利用 canvas private Paint pPaint; private Canvas cCanvas; private Bitmap bPic; private Rect rRect; public CustomView(Context context, Bitmap bitmap) { super(context); bPic = bitmap; pPaint = new Paint(); } @Override protected void onDraw(Canvas canvas) { cCanvas = canvas; this.drawMosic(200,200,200,200,5); } protected void drawMosic(int x, int y,int width,int height,int rect){ int currentPixel; cCanvas.drawBitmap(bPic, 0, 0, null); int mosicWidth = (int)Math.ceil(width/rect); int mosicHeight = (int)Math.ceil(height/rect); for(int i=0;i<mosicWidth;i++){ for(int j=0;j<mosicHeight;j++){ currentPixel = bPic.getPixel(x+i*rect, y+j*rect); pPaint.setColor(currentPixel); rRect = new Rect(x+i*rect,y + j*rect,x+(i+1)*rect,y + (j+1)*rect); cCanvas.drawRect(rRect, pPaint); } } }