/** * 将2张图片合成 * @param downBitmap 底部图片 * @param upBitmap 置顶的图片 * @return */ public Bitmap compoundBitmap(Bitmap downBitmap,Bitmap upBitmap) { if(downBitmap == null || upBitmap == null) { return null; } Bitmap mBitmap = downBitmap.copy(Bitmap.Config.ARGB_8888, true); Bitmap upNewBitmap = upBitmap; //如果遇到黑色,则显示downBitmap里面的颜色值,如果不是则显示upBitmap里面的颜色值 //循环获得bitmap所有像素点 int mBitmapWidth = mBitmap.getWidth(); int mBitmapHeight = mBitmap.getHeight(); //首先保证downBitmap和 upBitmap是一致的高宽大小 if (DEBUG) { Log.d("may", "mBitmapWidth=" + mBitmapWidth + ",upBitmap.getWidth()=" + upBitmap.getWidth()); Log.d("may", "mBitmapHeight=" + mBitmapHeight + ",upBitmap.getHeight()=" + upBitmap.getHeight()); } if(mBitmapWidth != upBitmap.getWidth() || mBitmapHeight != upBitmap.getHeight()) { upNewBitmap = resizeImage(upBitmap, mBitmapWidth, mBitmapHeight); } if(mBitmapWidth==upBitmap.getWidth() && mBitmapHeight==upBitmap.getHeight()) { if (DEBUG) Log.d("may", "compoundBitmap mBitmapWidth==upBitmap.getWidth()"); for (int i = 0; i < mBitmapHeight; i++) { for (int j = 0; j < mBitmapWidth; j++) { //获得Bitmap 图片中每一个点的color颜色值 //将需要填充的颜色值如果不是 //在这说明一下 如果color 是全透明 或者全黑 返回值为 0 //getPixel()不带透明通道 getPixel32()才带透明部分 所以全透明是0x00000000 //而不透明黑色是0xFF000000 如果不计算透明部分就都是0了 int color = upNewBitmap.getPixel(j, i); //将颜色值存在一个数组中 方便后面修改 if (color != Color.BLACK ) { if(color != 0x00000000 ) { mBitmap.setPixel(j, i, upNewBitmap.getPixel(j, i)); } } else { mBitmap.setPixel(j, i, 0x00000000); } } } } // downBitmap.recycle(); // upBitmap.recycle(); return mBitmap; } //使用Bitmap加Matrix来缩放 public Bitmap resizeImage(Bitmap bitmap, int w, int h) { Bitmap BitmapOrg = bitmap; int width = BitmapOrg.getWidth(); int height = BitmapOrg.getHeight(); int newWidth = w; int newHeight = h; float scaleWidth = ((float) newWidth) / width; float scaleHeight = ((float) newHeight) / height; Matrix matrix = new Matrix(); matrix.postScale(scaleWidth, scaleHeight); // if you want to rotate the Bitmap // matrix.postRotate(45); Bitmap resizedBitmap = Bitmap.createBitmap(BitmapOrg, 0, 0, width, height, matrix, true); //return new BitmapDrawable(resizedBitmap); return resizedBitmap; } /* 两张图片合成一张图片 */ private Bitmap mergeBitmap(Bitmap firstBitmap, Bitmap secondBitmap) { Bitmap bitmap = Bitmap.createBitmap(firstBitmap.getWidth(), firstBitmap.getHeight(), firstBitmap.getConfig()); Canvas canvas = new Canvas(bitmap); canvas.drawBitmap(firstBitmap, new Matrix(), null); // canvas.drawBitmap(firstBitmap,0, 0,null); canvas.drawBitmap(secondBitmap, 0, 0, null); return bitmap; } private Bitmap mergePhoto(Bitmap firstBitmap, Bitmap secondBitmap) { // 防止出现Immutable bitmap passed to Canvas constructor错误 // Bitmap bitmap1 = BitmapFactory.decodeResource(getResources(), // R.drawable.apple).copy(Bitmap.Config.ARGB_8888, true); // Bitmap bitmap2 = ((BitmapDrawable) getResources().getDrawable( // R.drawable.go)).getBitmap(); Bitmap bitmap = Bitmap.createBitmap(firstBitmap.getWidth(), firstBitmap.getHeight(), firstBitmap.getConfig()); Bitmap newBitmap = null; newBitmap = Bitmap.createBitmap(bitmap); Canvas canvas = new Canvas(newBitmap); Paint paint = new Paint(); int w = firstBitmap.getWidth(); int h = firstBitmap.getHeight(); int w_2 = secondBitmap.getWidth(); int h_2 = secondBitmap.getHeight(); paint.setColor(Color.GRAY); paint.setAlpha(125); canvas.drawRect(0, 0, firstBitmap.getWidth(), firstBitmap.getHeight(), paint); paint = new Paint(); canvas.drawBitmap(secondBitmap, Math.abs(w - w_2) / 2, Math.abs(h - h_2) / 2, paint); canvas.save(Canvas.ALL_SAVE_FLAG); // 存储新合成的图片 canvas.restore(); return newBitmap; } /* 从资源中获取的Drawable --> Bitmap mContext */ private Bitmap drawbleChangetoBitmap(int redId, Context context) { Resources res = context.getResources(); Bitmap bmp = BitmapFactory.decodeResource(res, redId); return bmp; } /** * 把图片转成圆形图片 * 这个暂时没有用 * @param bitmap * @return */ private Bitmap getRoundedCornerBitmap(Bitmap bitmap) { if(bitmap == null) { return null; } Bitmap roundBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(roundBitmap); int color = 0xff424242; Paint paint = new Paint(); Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()); RectF rectF = new RectF(rect); float roundPx = 50; paint.setAntiAlias(true); canvas.drawARGB(0, 0, 0, 0); paint.setColor(color); canvas.drawRoundRect(rectF, roundPx, roundPx, paint); paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); canvas.drawBitmap(bitmap, rect, rect, paint); return roundBitmap; } /** * 转换图片成圆形 * @param bitmap 传入Bitmap对象 * @return */ public static Bitmap toRoundBitmap(Bitmap bitmap) { if(bitmap == null) { return null; } int width = bitmap.getWidth(); int height = bitmap.getHeight(); float roundPx; float left,top,right,bottom,dst_left,dst_top,dst_right,dst_bottom; if (width <= height) { roundPx = width / 2; top = 0; bottom = width; left = 0; right = width; height = width; dst_left = 0; dst_top = 0; dst_right = width; dst_bottom = width; } else { roundPx = height / 2; float clip = (width - height) / 2; left = clip; right = width - clip; top = 0; bottom = height; width = height; dst_left = 0; dst_top = 0; dst_right = height; dst_bottom = height; } Bitmap output = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); if(output == null) { return null; } Canvas canvas = new Canvas(output); // final int color = 0xff424242; final Paint paint = new Paint(); final Rect src = new Rect((int)left, (int)top, (int)right, (int)bottom); final Rect dst = new Rect((int)dst_left, (int)dst_top, (int)dst_right, (int)dst_bottom); final RectF rectF = new RectF(dst); paint.setAntiAlias(true); canvas.drawARGB(0, 0, 0, 0); // paint.setColor(color); canvas.drawRoundRect(rectF, roundPx, roundPx, paint); paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); canvas.drawBitmap(bitmap, src, dst, paint); return output; } private static int mRoundedRate = 10; /** * 1.做圆角处理(椭圆) * 2.增加背景色 * @param src * @param iconSize * @return */ private static Bitmap addBorderToImage(Bitmap src, int iconSize) { if(src == null) { return null; } int width = iconSize;//getBorderWidth(); int height = iconSize;//getBorderHeight(); Bitmap output = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(output); RectF outerRect = new RectF(0,0,width,height); Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG|Paint.FILTER_BITMAP_FLAG); LinearGradient mLinearGradientClamp = new LinearGradient(0, 0, 0, height, new int[] {getCenterTopColor(src),getCenterBottomColor(src)}, null, Shader.TileMode.CLAMP); paint.setShader(mLinearGradientClamp); canvas.drawRoundRect(outerRect, width/mRoundedRate, height/mRoundedRate, paint); paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_ATOP)); int sw = src.getWidth(); int sh = src.getHeight(); Rect srcRect = new Rect(0,0,sw,sh); Rect dstRect = getDstRect(sw,sh,width,height); canvas.drawBitmap(src, srcRect, dstRect, paint); return output; } /** * 1.填充背景色 * 2.转换成圆形 * @param src * @param iconSize * @return */ public static Bitmap addBorderToRoundImage(Bitmap src, int iconSize) { Bitmap icon = addBorderToImage(src, iconSize); return toRoundBitmap(icon); } private static Rect getDstRect( int sw,int sh,int w,int h){ return new Rect(0,0,w,h); } /** * 得到原始图片中,底部中间的第一个完全不透明的颜色 * @return */ private static int getCenterTopColor(Bitmap src){ int w = src.getWidth(); int h = src.getHeight(); int x = (int) (w*0.5); int c = Color.WHITE; for(int y =h-1;y>=0;--y){ int pixel = src.getPixel(x, y); if(Color.alpha(pixel)==0xFF){ c = pixel; } } return c; // return softColor(c); } /** * 得到原始图片中,顶部中间的第一个完全不透明的颜色 * @return */ private static int getCenterBottomColor(Bitmap src){ int w = src.getWidth(); int h = src.getHeight(); int x = (int) (w*0.5); int c = Color.WHITE; for(int y =0;y<h;++y){ int pixel = src.getPixel(x, y); if(Color.alpha(pixel)==0xFF){ c = pixel; } } return c; // return softColor(c); } /** * 将颜色变浅,变淡 一旦使用此方法,边框颜色会对应不上,故上面两个方法没有使用 * @param color * @return */ private static int softColor(int color){ int r = (int) (Color.red(color)*1.3); int b = (int) (Color.blue(color)*1.3); int g = (int) (Color.green(color)*1.3); int af = 0xFF; if(b >= 0xFF){ b = 0xFF; } if(r>=0xFF){ r = 0xFF; } if(g>=0xFF){ g = 0xFF; } return af<<24|r<<16|g<<8|b; }