package edu.minggo.chat.util; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import android.graphics.Bitmap; import android.graphics.Bitmap.Config; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.ColorMatrix; import android.graphics.ColorMatrixColorFilter; import android.graphics.LinearGradient; import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.PorterDuff.Mode; import android.graphics.PorterDuffXfermode; import android.graphics.Rect; import android.graphics.RectF; import android.graphics.Shader.TileMode; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; /** * ����ͼƬ�Ĺ�����. */ public class ImageUitl { public static final int LEFT = 0; public static final int RIGHT = 1; public static final int TOP = 3; public static final int BOTTOM = 4; /** * ͼƬȥɫ,���ػҶ�ͼƬ * @param bmpOriginal �����ͼƬ * @return ȥɫ���ͼƬ */ public static Bitmap toGrayscale(Bitmap bmpOriginal) { int width, height; height = bmpOriginal.getHeight(); width = bmpOriginal.getWidth(); Bitmap bmpGrayscale = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565); Canvas c = new Canvas(bmpGrayscale); Paint paint = new Paint(); ColorMatrix cm = new ColorMatrix(); cm.setSaturation(0); ColorMatrixColorFilter f = new ColorMatrixColorFilter(cm); paint.setColorFilter(f); c.drawBitmap(bmpOriginal, 0, 0, paint); return bmpGrayscale; } /** * ȥɫͬʱ��Բ�� * @param bmpOriginal ԭͼ * @param pixels Բ�ǻ��� * @return �޸ĺ��ͼƬ */ public static Bitmap toGrayscale(Bitmap bmpOriginal, int pixels) { return toRoundCorner(toGrayscale(bmpOriginal), pixels); } /** * ��ͼƬ���Բ�� * @param bitmap ��Ҫ�޸ĵ�ͼƬ * @param pixels Բ�ǵĻ��� * @return Բ��ͼƬ */ public static Bitmap toRoundCorner(Bitmap bitmap, int pixels) { Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap .getHeight(), Config.ARGB_8888); Canvas canvas = new Canvas(output); final int color = 0xff424242; final Paint paint = new Paint(); final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()); final RectF rectF = new RectF(rect); final float roundPx = pixels; paint.setAntiAlias(true); canvas.drawARGB(0, 0, 0, 0); paint.setColor(color); canvas.drawRoundRect(rectF, roundPx, roundPx, paint); paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN)); canvas.drawBitmap(bitmap, rect, rect, paint); return output; } //���Բ��ͼƬ�ķ��� public static Bitmap getRoundedCornerBitmap(Bitmap bitmap,float roundPx){ Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap .getHeight(), Config.ARGB_8888); Canvas canvas = new Canvas(output); final int color = 0xff424242; final Paint paint = new Paint(); final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()); final RectF rectF = new RectF(rect); paint.setAntiAlias(true); canvas.drawARGB(0, 0, 0, 0); paint.setColor(color); canvas.drawRoundRect(rectF, roundPx, roundPx, paint); paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN)); canvas.drawBitmap(bitmap, rect, rect, paint); return output; } /** */ /** * ʹԲ�ǹ���֧��BitampDrawable * @param bitmapDrawable * @param pixels * @return */ public static BitmapDrawable toRoundCorner(BitmapDrawable bitmapDrawable, int pixels) { Bitmap bitmap = bitmapDrawable.getBitmap(); bitmapDrawable = new BitmapDrawable(toRoundCorner(bitmap, pixels)); return bitmapDrawable; } /** * ��ȡ·���е�ͼƬ��Ȼ����ת��Ϊ���ź��bitmap * @param path */ public static void saveBefore(String path) { BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; // ��ȡ���ͼƬ�Ŀ�͸� Bitmap bitmap = BitmapFactory.decodeFile(path, options); // ��ʱ����bmΪ�� options.inJustDecodeBounds = false; // �������ű� int be = (int) (options.outHeight / (float) 200); if (be <= 0) be = 1; options.inSampleSize = 2; // ͼƬ�������С����֮һ // ���¶���ͼƬ��ע�����Ҫ��options.inJustDecodeBounds ��Ϊ falseŶ bitmap = BitmapFactory.decodeFile(path, options); int w = bitmap.getWidth(); int h = bitmap.getHeight(); System.out.println(w + " " + h); // savePNG_After(bitmap,path); saveJPGE_After(bitmap, path); } /** * ����ͼƬΪPNG * @param bitmap * @param name */ public static void savePNG_After(Bitmap bitmap, String name) { File file = new File(name); try { FileOutputStream out = new FileOutputStream(file); if (bitmap.compress(Bitmap.CompressFormat.PNG, 100, out)) { out.flush(); out.close(); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } /** * ����ͼƬΪJPEG * @param bitmap * @param path */ public static void saveJPGE_After(Bitmap bitmap, String path) { File file = new File(path); try { FileOutputStream out = new FileOutputStream(file); if (bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out)) { out.flush(); out.close(); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } /** * ˮӡ * @param bitmap * @return */ public static Bitmap createBitmapForWatermark(Bitmap src, Bitmap watermark) { if (src == null) { return null; } int w = src.getWidth(); int h = src.getHeight(); int ww = watermark.getWidth(); int wh = watermark.getHeight(); // create the new blank bitmap Bitmap newb = Bitmap.createBitmap(w, h, Config.ARGB_8888);// ����һ���µĺ�SRC���ȿ��һ����λͼ Canvas cv = new Canvas(newb); // draw src into cv.drawBitmap(src, 0, 0, null);// �� 0��0���꿪ʼ����src // draw watermark into cv.drawBitmap(watermark, w - ww + 5, h - wh + 5, null);// ��src�����½ǻ���ˮӡ // save all clip cv.save(Canvas.ALL_SAVE_FLAG);// ���� // store cv.restore();// �洢 return newb; } /** * ͼƬ�ϳ� * @return */ public static Bitmap potoMix(int direction, Bitmap... bitmaps) { if (bitmaps.length <= 0) { return null; } if (bitmaps.length == 1) { return bitmaps[0]; } Bitmap newBitmap = bitmaps[0]; // newBitmap = createBitmapForFotoMix(bitmaps[0],bitmaps[1],direction); for (int i = 1; i < bitmaps.length; i++) { newBitmap = createBitmapForFotoMix(newBitmap, bitmaps[i], direction); } return newBitmap; } private static Bitmap createBitmapForFotoMix(Bitmap first, Bitmap second, int direction) { if (first == null) { return null; } if (second == null) { return first; } int fw = first.getWidth(); int fh = first.getHeight(); int sw = second.getWidth(); int sh = second.getHeight(); Bitmap newBitmap = null; if (direction == LEFT) { newBitmap = Bitmap.createBitmap(fw + sw, fh > sh ? fh : sh, Config.ARGB_8888); Canvas canvas = new Canvas(newBitmap); canvas.drawBitmap(first, sw, 0, null); canvas.drawBitmap(second, 0, 0, null); } else if (direction == RIGHT) { newBitmap = Bitmap.createBitmap(fw + sw, fh > sh ? fh : sh, Config.ARGB_8888); Canvas canvas = new Canvas(newBitmap); canvas.drawBitmap(first, 0, 0, null); canvas.drawBitmap(second, fw, 0, null); } else if (direction == TOP) { newBitmap = Bitmap.createBitmap(sw > fw ? sw : fw, fh + sh, Config.ARGB_8888); Canvas canvas = new Canvas(newBitmap); canvas.drawBitmap(first, 0, sh, null); canvas.drawBitmap(second, 0, 0, null); } else if (direction == BOTTOM) { newBitmap = Bitmap.createBitmap(sw > fw ? sw : fw, fh + sh, Config.ARGB_8888); Canvas canvas = new Canvas(newBitmap); canvas.drawBitmap(first, 0, 0, null); canvas.drawBitmap(second, 0, fh, null); } return newBitmap; } /** * ��Bitmapת����ָ����С * @param bitmap * @param width * @param height * @return */ public static Bitmap createBitmapBySize(Bitmap bitmap, int width, int height) { return Bitmap.createScaledBitmap(bitmap, width, height, true); } /** * Drawable ת Bitmap * @param drawable * @return */ public static Bitmap drawableToBitmapByBD(Drawable drawable) { BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable; return bitmapDrawable.getBitmap(); } /** * Bitmap ת Drawable * @param bitmap * @return */ public static Drawable bitmapToDrawableByBD(Bitmap bitmap) { Drawable drawable = new BitmapDrawable(bitmap); return drawable; } /** * byte[] ת bitmap * @param b * @return */ public static Bitmap bytesToBimap(byte[] b) { if (b.length != 0) { return BitmapFactory.decodeByteArray(b, 0, b.length); } else { return null; } } /** * bitmap ת byte[] * @param bm * @return */ public static byte[] bitmapToBytes(Bitmap bm) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); bm.compress(Bitmap.CompressFormat.PNG, 100, baos); return baos.toByteArray(); } /** * ��ô���Ӱ��ͼƬ���� * @param bitmap * @return */ public static Bitmap createReflectionImageWithOrigin(Bitmap bitmap){ final int reflectionGap = 4; int width = bitmap.getWidth(); int height = bitmap.getHeight(); Matrix matrix = new Matrix(); matrix.preScale(1, -1); Bitmap reflectionImage = Bitmap.createBitmap(bitmap, 0, (int) (height/2.5), width, height/2, matrix, false); Bitmap bitmapWithReflection = Bitmap.createBitmap(width, (height + height/2), Config.ARGB_8888); Canvas canvas = new Canvas(bitmapWithReflection); canvas.drawBitmap(bitmap, 0, 0, null); Paint deafalutPaint = new Paint(); canvas.drawRect(0, height,width,height + reflectionGap, deafalutPaint); canvas.drawBitmap(reflectionImage, 0, height + reflectionGap, null); Paint paint = new Paint(); LinearGradient shader = new LinearGradient(0, bitmap.getHeight(), 0, bitmapWithReflection.getHeight() + reflectionGap, 0x70ffffff, 0x00ffffff, TileMode.CLAMP); paint.setShader(shader); // Set the Transfer mode to be porter duff and destination in paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN)); // Draw a rectangle using the paint with our linear gradient canvas.drawRect(0, height, width, bitmapWithReflection.getHeight() + reflectionGap, paint); return bitmapWithReflection; } }