Android中图片的处理(放大缩小,去色,转换格式,增加水印等)
转载网站:http://www.linuxidc.com/Linux/2011-11/48110.htm###
1 package com.dzh.operateimage;
2 import android.graphics.Bitmap;
3 import android.graphics.Bitmap.Config;
4 import android.graphics.BitmapFactory;
5 import android.graphics.Canvas;
6 import android.graphics.ColorMatrix;
7 import android.graphics.ColorMatrixColorFilter;
8 import android.graphics.Paint;
9 import android.graphics.PorterDuff.Mode;
10 import android.graphics.PorterDuffXfermode;
11 import android.graphics.Rect;
12 import android.graphics.RectF;
13 import android.graphics.drawable.BitmapDrawable;
14 import android.graphics.drawable.Drawable;
15 import java.io.ByteArrayOutputStream;
16 import java.io.File;
17 import java.io.FileNotFoundException;
18 import java.io.FileOutputStream;
19 import java.io.IOException;
20 /**
21 * 处理图片的工具类.
22 */
23 public class ImageTools {
24 public static final int LEFT = 0;
25 public static final int RIGHT = 1;
26 public static final int TOP = 3;
27 public static final int BOTTOM = 4;
28 /** */
29 /**
30 * 图片去色,返回灰度图片
31 *
32 * @param bmpOriginal 传入的图片
33 * @return 去色后的图片
34 */
35 public static Bitmap toGrayscale(Bitmap bmpOriginal) {
36 int width, height;
37 height = bmpOriginal.getHeight();
38 width = bmpOriginal.getWidth();
39 Bitmap bmpGrayscale = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
40 Canvas c = new Canvas(bmpGrayscale);
41 Paint paint = new Paint();
42 ColorMatrix cm = new ColorMatrix();
43 cm.setSaturation(0);
44 ColorMatrixColorFilter f = new ColorMatrixColorFilter(cm);
45 paint.setColorFilter(f);
46 c.drawBitmap(bmpOriginal, 0, 0, paint);
47 return bmpGrayscale;
48 }
49 /** */
50 /**
51 * 去色同时加圆角
52 *
53 * @param bmpOriginal 原图
54 * @param pixels 圆角弧度
55 * @return 修改后的图片
56 */
57 public static Bitmap toGrayscale(Bitmap bmpOriginal, int pixels) {
58 return toRoundCorner(toGrayscale(bmpOriginal), pixels);
59 }
60 /** */
61 /**
62 * 把图片变成圆角
63 *
64 * @param bitmap 需要修改的图片
65 * @param pixels 圆角的弧度
66 * @return 圆角图片
67 */
68 public static Bitmap toRoundCorner(Bitmap bitmap, int pixels) {
69 Bitmap output = Bitmap
70 .createBitmap(bitmap.getWidth(), bitmap.getHeight(), Config.ARGB_8888);
71 Canvas canvas = new Canvas(output);
72 final int color = 0xff424242;
73 final Paint paint = new Paint();
74 final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
75 final RectF rectF = new RectF(rect);
76 final float roundPx = pixels;
77 paint.setAntiAlias(true);
78 canvas.drawARGB(0, 0, 0, 0);
79 paint.setColor(color);
80 canvas.drawRoundRect(rectF, roundPx, roundPx, paint);
81 paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
82 canvas.drawBitmap(bitmap, rect, rect, paint);
83 return output;
84 }
85 /** */
86 /**
87 * 使圆角功能支持BitampDrawable
88 *
89 * @param bitmapDrawable
90 * @param pixels
91 * @return
92 */
93 public static BitmapDrawable toRoundCorner(BitmapDrawable bitmapDrawable, int pixels) {
94 Bitmap bitmap = bitmapDrawable.getBitmap();
95 bitmapDrawable = new BitmapDrawable(toRoundCorner(bitmap, pixels));
96 return bitmapDrawable;
97 }
98 /**
99 * 读取路径中的图片,然后将其转化为缩放后的bitmap
100 *
101 * @param path
102 */
103 public static void saveBefore(String path) {
104 BitmapFactory.Options options = new BitmapFactory.Options();
105 options.inJustDecodeBounds = true;
106 // 获取这个图片的宽和高
107 Bitmap bitmap = BitmapFactory.decodeFile(path, options); // 此时返回bm为空
108 options.inJustDecodeBounds = false;
109 // 计算缩放比
110 int be = (int)(options.outHeight / (float)200);
111 if (be <= 0)
112 be = 1;
113 options.inSampleSize = 2; // 图片长宽各缩小二分之一
114 // 重新读入图片,注意这次要把options.inJustDecodeBounds 设为 false哦
115 bitmap = BitmapFactory.decodeFile(path, options);
116 int w = bitmap.getWidth();
117 int h = bitmap.getHeight();
118 System.out.println(w + " " + h);
119 // savePNG_After(bitmap,path);
120 saveJPGE_After(bitmap, path);
121 }
122 /**
123 * 保存图片为PNG
124 *
125 * @param bitmap
126 * @param name
127 */
128 public static void savePNG_After(Bitmap bitmap, String name) {
129 File file = new File(name);
130 try {
131 FileOutputStream out = new FileOutputStream(file);
132 if (bitmap.compress(Bitmap.CompressFormat.PNG, 100, out)) {
133 out.flush();
134 out.close();
135 }
136 } catch (FileNotFoundException e) {
137 e.printStackTrace();
138 } catch (IOException e) {
139 e.printStackTrace();
140 }
141 }
142 /**
143 * 保存图片为JPEG
144 *
145 * @param bitmap
146 * @param path
147 */
148 public static void saveJPGE_After(Bitmap bitmap, String path) {
149 File file = new File(path);
150 try {
151 FileOutputStream out = new FileOutputStream(file);
152 if (bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out)) {
153 out.flush();
154 out.close();
155 }
156 } catch (FileNotFoundException e) {
157 e.printStackTrace();
158 } catch (IOException e) {
159 e.printStackTrace();
160 }
161 }
162 /**
163 * 水印
164 *
165 * @param bitmap
166 * @return
167 */
168 public static Bitmap createBitmapForWatermark(Bitmap src, Bitmap watermark) {
169 if (src == null) {
170 return null;
171 }
172 int w = src.getWidth();
173 int h = src.getHeight();
174 int ww = watermark.getWidth();
175 int wh = watermark.getHeight();
176 // create the new blank bitmap
177 Bitmap newb = Bitmap.createBitmap(w, h, Config.ARGB_8888);// 创建一个新的和SRC长度宽度一样的位图
178 Canvas cv = new Canvas(newb);
179 // draw src into
180 cv.drawBitmap(src, 0, 0, null);// 在 0,0坐标开始画入src
181 // draw watermark into
182 cv.drawBitmap(watermark, w - ww + 5, h - wh + 5, null);// 在src的右下角画入水印
183 // save all clip
184 cv.save(Canvas.ALL_SAVE_FLAG);// 保存
185 // store
186 cv.restore();// 存储
187 return newb;
188 }
189 /**
190 * 图片合成
191 *
192 * @return
193 */
194 public static Bitmap potoMix(int direction, Bitmap... bitmaps) {
195 if (bitmaps.length <= 0) {
196 return null;
197 }
198 if (bitmaps.length == 1) {
199 return bitmaps[0];
200 }
201 Bitmap newBitmap = bitmaps[0];
202 // newBitmap = createBitmapForFotoMix(bitmaps[0],bitmaps[1],direction);
203 for (int i = 1; i < bitmaps.length; i++) {
204 newBitmap = createBitmapForFotoMix(newBitmap, bitmaps[i], direction);
205 }
206 return newBitmap;
207 }
208
209 private static Bitmap createBitmapForFotoMix(Bitmap first, Bitmap second, int direction) {
210 if (first == null) {
211 return null;
212 }
213 if (second == null) {
214 return first;
215 }
216 int fw = first.getWidth();
217 int fh = first.getHeight();
218 int sw = second.getWidth();
219 int sh = second.getHeight();
220 Bitmap newBitmap = null;
221 if (direction == LEFT) {
222 newBitmap = Bitmap.createBitmap(fw + sw, fh > sh ? fh : sh, Config.ARGB_8888);
223 Canvas canvas = new Canvas(newBitmap);
224 canvas.drawBitmap(first, sw, 0, null);
225 canvas.drawBitmap(second, 0, 0, null);
226 } else if (direction == RIGHT) {
227 newBitmap = Bitmap.createBitmap(fw + sw, fh > sh ? fh : sh, Config.ARGB_8888);
228 Canvas canvas = new Canvas(newBitmap);
229 canvas.drawBitmap(first, 0, 0, null);
230 canvas.drawBitmap(second, fw, 0, null);
231 } else if (direction == TOP) {
232 newBitmap = Bitmap.createBitmap(sw > fw ? sw : fw, fh + sh, Config.ARGB_8888);
233 Canvas canvas = new Canvas(newBitmap);
234 canvas.drawBitmap(first, 0, sh, null);
235 canvas.drawBitmap(second, 0, 0, null);
236 } else if (direction == BOTTOM) {
237 newBitmap = Bitmap.createBitmap(sw > fw ? sw : fw, fh + sh, Config.ARGB_8888);
238 Canvas canvas = new Canvas(newBitmap);
239 canvas.drawBitmap(first, 0, 0, null);
240 canvas.drawBitmap(second, 0, fh, null);
241 }
242 return newBitmap;
243 }
244 /**
245 * 将Bitmap转换成指定大小
246 * @param bitmap
247 * @param width
248 * @param height
249 * @return
250 */
251 public static Bitmap createBitmapBySize(Bitmap bitmap,int width,int height)
252 {
253 return Bitmap.createScaledBitmap(bitmap, width, height, true);
254 }
255 /**
256 * Drawable 转 Bitmap
257 *
258 * @param drawable
259 * @return
260 */
261 public static Bitmap drawableToBitmapByBD(Drawable drawable) {
262 BitmapDrawable bitmapDrawable = (BitmapDrawable)drawable;
263 return bitmapDrawable.getBitmap();
264 }
265 /**
266 * Bitmap 转 Drawable
267 *
268 * @param bitmap
269 * @return
270 */
271 public static Drawable bitmapToDrawableByBD(Bitmap bitmap) {
272 Drawable drawable = new BitmapDrawable(bitmap);
273 return drawable;
274 }
275 /**
276 * byte[] 转 bitmap
277 *
278 * @param b
279 * @return
280 */
281 public static Bitmap bytesToBimap(byte[] b) {
282 if (b.length != 0) {
283 return BitmapFactory.decodeByteArray(b, 0, b.length);
284 } else {
285 return null;
286 }
287 }
288 /**
289 * bitmap 转 byte[]
290 *
291 * @param bm
292 * @return
293 */
294 public static byte[] bitmapToBytes(Bitmap bm) {
295 ByteArrayOutputStream baos = new ByteArrayOutputStream();
296 bm.compress(Bitmap.CompressFormat.PNG, 100, baos);
297 return baos.toByteArray();
298 }
299 }