001packagecom.dzh.operateimage;
002importandroid.graphics.Bitmap;
003importandroid.graphics.Bitmap.Config;
004importandroid.graphics.BitmapFactory;
005importandroid.graphics.Canvas;
006importandroid.graphics.ColorMatrix;
007importandroid.graphics.ColorMatrixColorFilter;
008importandroid.graphics.Paint;
009importandroid.graphics.PorterDuff.Mode;
010importandroid.graphics.PorterDuffXfermode;
011importandroid.graphics.Rect;
012importandroid.graphics.RectF;
013importandroid.graphics.drawable.BitmapDrawable;
014importandroid.graphics.drawable.Drawable;
015importjava.io.ByteArrayOutputStream;
016importjava.io.File;
017importjava.io.FileNotFoundException;
018importjava.io.FileOutputStream;
019importjava.io.IOException;
020/**
021* 处理图片的工具类.
022*/
023public classImageTools {
024public static final intLEFT = 0;
025public static final intRIGHT = 1;
026public static final intTOP = 3;
027public static final intBOTTOM = 4;
028/** */
029/**
030* 图片去色,返回灰度图片
031*
032* @param bmpOriginal 传入的图片
033* @return 去色后的图片
034*/
035public staticBitmap toGrayscale(Bitmap bmpOriginal) {
036intwidth, height;
037height = bmpOriginal.getHeight();
038width = bmpOriginal.getWidth();
039Bitmap bmpGrayscale = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
040Canvas c = newCanvas(bmpGrayscale);
041Paint paint = newPaint();
042ColorMatrix cm = newColorMatrix();
043cm.setSaturation(0);
044ColorMatrixColorFilter f = newColorMatrixColorFilter(cm);
045paint.setColorFilter(f);
046c.drawBitmap(bmpOriginal, 0, 0, paint);
047returnbmpGrayscale;
048}
049/** */
050/**
051* 去色同时加圆角
052*
053* @param bmpOriginal 原图
054* @param pixels 圆角弧度
055* @return 修改后的图片
056*/
057public static Bitmap toGrayscale(Bitmap bmpOriginal, intpixels) {
058returntoRoundCorner(toGrayscale(bmpOriginal), pixels);
059}
060/** */
061/**
062* 把图片变成圆角
063*
064* @param bitmap 需要修改的图片
065* @param pixels 圆角的弧度
066* @return 圆角图片
067*/
068public static Bitmap toRoundCorner(Bitmap bitmap, intpixels) {
069Bitmap output = Bitmap
070.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Config.ARGB_8888);
071Canvas canvas = newCanvas(output);
072final intcolor = 0xff424242;
073final Paint paint = newPaint();
074final Rect rect = newRect(0, 0, bitmap.getWidth(), bitmap.getHeight());
075final RectF rectF = newRectF(rect);
076final floatroundPx = pixels;
077paint.setAntiAlias(true);
078canvas.drawARGB(0, 0, 0, 0);
079paint.setColor(color);
080canvas.drawRoundRect(rectF, roundPx, roundPx, paint);
081paint.setXfermode(newPorterDuffXfermode(Mode.SRC_IN));
082canvas.drawBitmap(bitmap, rect, rect, paint);
083returnoutput;
084}
085/** */
086/**
087* 使圆角功能支持BitampDrawable
088*
089* @param bitmapDrawable
090* @param pixels
091* @return
092*/
093public staticBitmapDrawable toRoundCorner(BitmapDrawable bitmapDrawable, intpixels) {
094Bitmap bitmap = bitmapDrawable.getBitmap();
095bitmapDrawable = newBitmapDrawable(toRoundCorner(bitmap, pixels));
096returnbitmapDrawable;
097}
098/**
099* 读取路径中的图片,然后将其转化为缩放后的bitmap
100*
101* @param path
102*/
103public static voidsaveBefore(String path) {
104BitmapFactory.Options options = newBitmapFactory.Options();
105options.inJustDecodeBounds = true;
106// 获取这个图片的宽和高
107Bitmap bitmap = BitmapFactory.decodeFile(path, options); // 此时返回bm为空
108options.inJustDecodeBounds = false;
109// 计算缩放比
110intbe = (int)(options.outHeight / (float)200);
111if(be <= 0)
112be = 1;
113options.inSampleSize = 2; // 图片长宽各缩小二分之一
114// 重新读入图片,注意这次要把options.inJustDecodeBounds 设为 false哦
115bitmap = BitmapFactory.decodeFile(path, options);
116intw = bitmap.getWidth();
117inth = bitmap.getHeight();
118System.out.println(w + " "+ h);
119// savePNG_After(bitmap,path);
120saveJPGE_After(bitmap, path);
121}
122/**
123* 保存图片为PNG
124*
125* @param bitmap
126* @param name
127*/
128public static voidsavePNG_After(Bitmap bitmap, String name) {
129File file = newFile(name);
130try{
131FileOutputStream out = newFileOutputStream(file);
132if(bitmap.compress(Bitmap.CompressFormat.PNG, 100, out)) {
133out.flush();
134out.close();
135}
136} catch(FileNotFoundException e) {
137e.printStackTrace();
138} catch(IOException e) {
139e.printStackTrace();
140}
141}
142/**
143* 保存图片为JPEG
144*
145* @param bitmap
146* @param path
147*/
148public static voidsaveJPGE_After(Bitmap bitmap, String path) {
149File file = newFile(path);
150try{
151FileOutputStream out = newFileOutputStream(file);
152if(bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out)) {
153out.flush();
154out.close();
155}
156} catch(FileNotFoundException e) {
157e.printStackTrace();
158} catch(IOException e) {
159e.printStackTrace();
160}
161}
162/**
163* 水印
164*
165* @param bitmap
166* @return
167*/
168public staticBitmap createBitmapForWatermark(Bitmap src, Bitmap watermark) {
169if(src == null) {
170returnnull;
171}
172intw = src.getWidth();
173inth = src.getHeight();
174intww = watermark.getWidth();
175intwh = watermark.getHeight();
176// create the new blank bitmap
177Bitmap newb = Bitmap.createBitmap(w, h, Config.ARGB_8888);// 创建一个新的和SRC长度宽度一样的位图
178Canvas cv = newCanvas(newb);
179// draw src into
180cv.drawBitmap(src, 0, 0, null);// 在 0,0坐标开始画入src
181// draw watermark into
182cv.drawBitmap(watermark, w - ww + 5, h - wh + 5, null);// 在src的右下角画入水印
183// save all clip
184cv.save(Canvas.ALL_SAVE_FLAG);// 保存
185// store
186cv.restore();// 存储
187returnnewb;
188}
189/**
190* 图片合成
191*
192* @return
193*/
194public static Bitmap potoMix(intdirection, Bitmap... bitmaps) {
195if(bitmaps.length <= 0) {
196returnnull;
197}
198if(bitmaps.length == 1) {
199returnbitmaps[0];
200}
201Bitmap newBitmap = bitmaps[0];
202// newBitmap = createBitmapForFotoMix(bitmaps[0],bitmaps[1],direction);
203for (inti = 1; i < bitmaps.length; i++) {
204newBitmap = createBitmapForFotoMix(newBitmap, bitmaps[i], direction);
205}
206returnnewBitmap;
207}
208
209private staticBitmap createBitmapForFotoMix(Bitmap first, Bitmap second, intdirection) {
210if(first == null) {
211returnnull;
212}
213if(second == null) {
214returnfirst;
215}
216intfw = first.getWidth();
217intfh = first.getHeight();
218intsw = second.getWidth();
219intsh = second.getHeight();
220Bitmap newBitmap = null;
221if(direction == LEFT) {
222newBitmap = Bitmap.createBitmap(fw + sw, fh > sh ? fh : sh, Config.ARGB_8888);
223Canvas canvas = newCanvas(newBitmap);
224canvas.drawBitmap(first, sw, 0, null);
225canvas.drawBitmap(second, 0, 0, null);
226} else if(direction == RIGHT) {
227newBitmap = Bitmap.createBitmap(fw + sw, fh > sh ? fh : sh, Config.ARGB_8888);
228Canvas canvas = newCanvas(newBitmap);
229canvas.drawBitmap(first, 0, 0, null);
230canvas.drawBitmap(second, fw, 0, null);
231} else if(direction == TOP) {
232newBitmap = Bitmap.createBitmap(sw > fw ? sw : fw, fh + sh, Config.ARGB_8888);
233Canvas canvas = newCanvas(newBitmap);
234canvas.drawBitmap(first, 0, sh, null);
235canvas.drawBitmap(second, 0, 0, null);
236} else if(direction == BOTTOM) {
237newBitmap = Bitmap.createBitmap(sw > fw ? sw : fw, fh + sh, Config.ARGB_8888);
238Canvas canvas = newCanvas(newBitmap);
239canvas.drawBitmap(first, 0, 0, null);
240canvas.drawBitmap(second, 0, fh, null);
241}
242returnnewBitmap;
243}
244/**
245* 将Bitmap转换成指定大小
246* @param bitmap
247* @param width
248* @param height
249* @return
250*/
251public static Bitmap createBitmapBySize(Bitmap bitmap,int width,intheight)
252{
253returnBitmap.createScaledBitmap(bitmap, width, height, true);
254}
255/**
256* Drawable 转 Bitmap
257*
258* @param drawable
259* @return
260*/
261public staticBitmap drawableToBitmapByBD(Drawable drawable) {
262BitmapDrawable bitmapDrawable = (BitmapDrawable)drawable;
263returnbitmapDrawable.getBitmap();
264}
265/**
266* Bitmap 转 Drawable
267*
268* @param bitmap
269* @return
270*/
271public staticDrawable bitmapToDrawableByBD(Bitmap bitmap) {
272Drawable drawable = newBitmapDrawable(bitmap);
273returndrawable;
274}
275/**
276* byte[] 转 bitmap
277*
278* @param b
279* @return
280*/
281public staticBitmap bytesToBimap(byte[] b) {
282if(b.length != 0) {
283returnBitmapFactory.decodeByteArray(b, 0, b.length);
284} else{
285returnnull;
286}
287}
288/**
289* bitmap 转 byte[]
290*
291* @param bm
292* @return
293*/
294public staticbyte[] bitmapToBytes(Bitmap bm) {
295ByteArrayOutputStream baos = newByteArrayOutputStream();
296bm.compress(Bitmap.CompressFormat.PNG, 100, baos);
297returnbaos.toByteArray();
298}
299}