android 圖片處理

来源:互联网 发布:java classloader使用 编辑:程序博客网 时间:2024/06/07 06:14

android 圖片處理

時間:2011-11-24 19:43來源:Internet 作者:Internet 點擊: 137 次
多張圖片四個方位的圖片合成,改變bitmap大小,圖片去色等功能   package com.dzh.operateimage;import android.graphics.Bitmap;i

多張圖片四個方位的圖片合成,改變bitmap大小,圖片去色等功能 



 

 

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 bitmapBitmap newb = Bitmap.createBitmap(w, h, Config.ARGB_8888);// 創建一個新的和SRC長度寬度一样的位圖Canvas cv = new Canvas(newb);// draw src intocv.drawBitmap(src, 0, 0, null);// 在 0,0坐標開始畫入src// draw watermark intocv.drawBitmap(watermark, w - ww + 5, h - wh + 5, null);// 在src的右下角畫入水印// save all clipcv.save(Canvas.ALL_SAVE_FLAG);// 保存// storecv.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();}}
From:http://zhanhao.iteye.com/blog/1276449