Android中圖片的處理(放大縮小,去色,轉換格式,增加水印等),多張圖片四個方位的圖片合成,改變bitmap大小,圖片去色等功能
Java代碼
- package com.dzh.operateimage;
- 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.Paint;
- import android.graphics.PorterDuff.Mode;
- import android.graphics.PorterDuffXfermode;
- import android.graphics.Rect;
- import android.graphics.RectF;
- import android.graphics.drawable.BitmapDrawable;
- import android.graphics.drawable.Drawable;
- import java.io.ByteArrayOutputStream;
- import java.io.File;
- import java.io.FileNotFoundException;
- import java.io.FileOutputStream;
- import java.io.IOException;
- /**
- * 處理圖片的工具類.
- */
- public class ImageTools {
- 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;
- }
- /** */
- /**
- * 使圓角功能支持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();
- }
- }