android 工具类之图片加工

  1     /** 
  2      * 图片加工厂 
  3      *  
  4      * @author way 
  5      *  
  6      */  
  7     public class ImageUtil {  
  8         /** 
  9          * 通过路径获取输入流 
 10          *  
 11          * @param path 
 12          *            路径 
 13          * @return 输入流 
 14          * @throws Exception 
 15          *             异常 
 16          */  
 17         public static InputStream getRequest(String path) throws Exception {  
 18             URL url = new URL(path);  
 19             HttpURLConnection conn = (HttpURLConnection) url.openConnection();  
 20             conn.setRequestMethod("GET");  
 21             conn.setConnectTimeout(5000);  
 22             if (conn.getResponseCode() == 200) {  
 23                 return conn.getInputStream();  
 24             }  
 25             return null;  
 26         }  
 27       
 28         /** 
 29          * 从流中读取二进制数据 
 30          *  
 31          * @param inStream 
 32          *            输入流 
 33          * @return 二进制数据 
 34          * @throws Exception 
 35          *             异常 
 36          */  
 37         public static byte[] readInputStream(InputStream inStream) throws Exception {  
 38             ByteArrayOutputStream outSteam = new ByteArrayOutputStream();  
 39             byte[] buffer = new byte[4096];  
 40             int len = 0;  
 41             while ((len = inStream.read(buffer)) != -1) {  
 42                 outSteam.write(buffer, 0, len);  
 43             }  
 44             outSteam.close();  
 45             inStream.close();  
 46             return outSteam.toByteArray();  
 47         }  
 48       
 49         /** 
 50          * 把一个路径转换成Drawable对象 
 51          *  
 52          * @param url 
 53          *            路径 
 54          * @return Drawable对象 
 55          */  
 56         public static Drawable loadImageFromUrl(String url) {  
 57             URL m;  
 58             InputStream i = null;  
 59             try {  
 60                 m = new URL(url);  
 61                 i = (InputStream) m.getContent();  
 62             } catch (MalformedURLException e1) {  
 63                 e1.printStackTrace();  
 64             } catch (IOException e) {  
 65                 e.printStackTrace();  
 66             }  
 67             Drawable d = Drawable.createFromStream(i, "src");  
 68             return d;  
 69         }  
 70       
 71         /** 
 72          * 把一个路径转换成Drawable对象 
 73          *  
 74          * @param url 
 75          *            字符串路径 
 76          * @return Drawable对象 
 77          * @throws Exception 
 78          *             异常 
 79          */  
 80         public static Drawable getDrawableFromUrl(String url) throws Exception {  
 81             return Drawable.createFromStream(getRequest(url), null);  
 82         }  
 83       
 84         /** 
 85          * 从路径中得到位图 
 86          *  
 87          * @param url 
 88          *            字符串路径 
 89          * @return 位图 
 90          * @throws Exception 
 91          *             异常 
 92          */  
 93         public static Bitmap getBitmapFromUrl(String url) throws Exception {  
 94             byte[] bytes = getBytesFromUrl(url);  
 95             return byteToBitmap(bytes);  
 96         }  
 97       
 98         /** 
 99          * 从路径中得到圆角位图 
100          *  
101          * @param url 
102          *            字符串路径 
103          * @param pixels 
104          *            圆角弧度 
105          * @return 圆角位图 
106          * @throws Exception 
107          *             异常 
108          */  
109         public static Bitmap getRoundBitmapFromUrl(String url, int pixels)  
110                 throws Exception {  
111             byte[] bytes = getBytesFromUrl(url);  
112             Bitmap bitmap = byteToBitmap(bytes);  
113             return toRoundCorner(bitmap, pixels);  
114         }  
115       
116         /** 
117          * 从路径中得到圆角Drawable对象 
118          *  
119          * @param url 
120          *            字符串路径 
121          * @param pixels 
122          *            圆角弧度 
123          * @return 圆角Drawable对象 
124          * @throws Exception 
125          *             异常 
126          */  
127         public static Drawable geRoundDrawableFromUrl(String url, int pixels)  
128                 throws Exception {  
129             byte[] bytes = getBytesFromUrl(url);  
130             BitmapDrawable bitmapDrawable = (BitmapDrawable) byteToDrawable(bytes);  
131             return toRoundCorner(bitmapDrawable, pixels);  
132         }  
133       
134         /** 
135          * 从路径中得到二进制数据 
136          *  
137          * @param url 
138          *            字符串路径 
139          * @return 二进制数据 
140          * @throws Exception 
141          *             异常 
142          */  
143         public static byte[] getBytesFromUrl(String url) throws Exception {  
144             return readInputStream(getRequest(url));  
145         }  
146       
147         /** 
148          * 从二进制数据中得到位图 
149          *  
150          * @param byteArray 
151          *            二进制数据 
152          * @return 位图 
153          */  
154         public static Bitmap byteToBitmap(byte[] byteArray) {  
155             if (byteArray.length != 0) {  
156                 return BitmapFactory  
157                         .decodeByteArray(byteArray, 0, byteArray.length);  
158             } else {  
159                 return null;  
160             }  
161         }  
162       
163         /** 
164          * 从二进制数据中得到Drawable对象 
165          *  
166          * @param byteArray 
167          *            二进制数据 
168          * @return Drawable对象 
169          */  
170         public static Drawable byteToDrawable(byte[] byteArray) {  
171             ByteArrayInputStream ins = new ByteArrayInputStream(byteArray);  
172             return Drawable.createFromStream(ins, null);  
173         }  
174       
175         /** 
176          * 把位图转换称二进制数据 
177          *  
178          * @param bm 
179          *            位图 
180          * @return 二进制数据 
181          */  
182         public static byte[] Bitmap2Bytes(Bitmap bm) {  
183             ByteArrayOutputStream baos = new ByteArrayOutputStream();  
184             bm.compress(Bitmap.CompressFormat.PNG, 100, baos);  
185             return baos.toByteArray();  
186         }  
187       
188         /** 
189          * 把Drawable对象转换称位图 
190          *  
191          * @param drawable 
192          *            Drawable对象 
193          * @return 位图 
194          */  
195         public static Bitmap drawableToBitmap(Drawable drawable) {  
196       
197             Bitmap bitmap = Bitmap  
198                     .createBitmap(  
199                             drawable.getIntrinsicWidth(),  
200                             drawable.getIntrinsicHeight(),  
201                             drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888  
202                                     : Bitmap.Config.RGB_565);  
203             Canvas canvas = new Canvas(bitmap);  
204             drawable.setBounds(0, 0, drawable.getIntrinsicWidth(),  
205                     drawable.getIntrinsicHeight());  
206             drawable.draw(canvas);  
207             return bitmap;  
208         }  
209       
210         /** 
211          * 图片去色,返回灰度图片 
212          *  
213          * @param bmpOriginal 
214          *            传入的图片 
215          * @return 去色后的图片 
216          */  
217         public static Bitmap toGrayscale(Bitmap bmpOriginal) {  
218             int width, height;  
219             height = bmpOriginal.getHeight();  
220             width = bmpOriginal.getWidth();  
221       
222             Bitmap bmpGrayscale = Bitmap.createBitmap(width, height,  
223                     Bitmap.Config.RGB_565);  
224             Canvas c = new Canvas(bmpGrayscale);  
225             Paint paint = new Paint();  
226             ColorMatrix cm = new ColorMatrix();  
227             cm.setSaturation(0);  
228             ColorMatrixColorFilter f = new ColorMatrixColorFilter(cm);  
229             paint.setColorFilter(f);  
230             c.drawBitmap(bmpOriginal, 0, 0, paint);  
231             return bmpGrayscale;  
232         }  
233       
234         /** 
235          * 去色同时加圆角 
236          *  
237          * @param bmpOriginal 
238          *            原图 
239          * @param pixels 
240          *            圆角弧度 
241          * @return 修改后的图片 
242          */  
243         public static Bitmap toGrayscale(Bitmap bmpOriginal, int pixels) {  
244             return toRoundCorner(toGrayscale(bmpOriginal), pixels);  
245         }  
246       
247         /** 
248          * 把位图变成圆角位图 
249          *  
250          * @param bitmap 
251          *            需要修改的位图 
252          * @param pixels 
253          *            圆角的弧度 
254          * @return 圆角位图 
255          */  
256         public static Bitmap toRoundCorner(Bitmap bitmap, int pixels) {  
257       
258             Bitmap output = Bitmap.createBitmap(bitmap.getWidth(),  
259                     bitmap.getHeight(), Config.ARGB_8888);  
260             Canvas canvas = new Canvas(output);  
261       
262             final int color = 0xff424242;  
263             final Paint paint = new Paint();  
264             final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());  
265             final RectF rectF = new RectF(rect);  
266             final float roundPx = pixels;  
267       
268             paint.setAntiAlias(true);  
269             canvas.drawARGB(0, 0, 0, 0);  
270             paint.setColor(color);  
271             canvas.drawRoundRect(rectF, roundPx, roundPx, paint);  
272       
273             paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));  
274             canvas.drawBitmap(bitmap, rect, rect, paint);  
275       
276             return output;  
277         }  
278       
279         /** 
280          * 将BitampDrawable转换成圆角的BitampDrawable 
281          *  
282          * @param bitmapDrawable 
283          *            原生BitampDrawable对象 
284          * @param pixels 
285          *            圆角弧度 
286          * @return 圆角BitampDrawable对象 
287          */  
288         public static BitmapDrawable toRoundCorner(BitmapDrawable bitmapDrawable,  
289                 int pixels) {  
290             Bitmap bitmap = bitmapDrawable.getBitmap();  
291             bitmapDrawable = new BitmapDrawable(toRoundCorner(bitmap, pixels));  
292             return bitmapDrawable;  
293         }  
294       
295         /** 
296          * 图片水印生成的方法 
297          *  
298          * @param src 
299          *            源图片位图 
300          * @param watermark 
301          *            水印图片位图 
302          * @return 返回一个加了水印的图片 
303          */  
304         public static Bitmap createBitmap(Bitmap src, Bitmap watermark) {  
305             if (src == null)  
306                 return null;  
307             int w = src.getWidth();  
308             int h = src.getHeight();  
309             int ww = watermark.getWidth();  
310             int wh = watermark.getHeight();  
311             Bitmap newb = Bitmap.createBitmap(w, h, Config.ARGB_8888);// 创建一个新的和SRC长度宽度一样的位图  
312             Canvas cv = new Canvas(newb);// 初始化画布  
313             cv.drawBitmap(src, 0, 0, null);// 在 0,0坐标开始画入src  
314             cv.drawBitmap(watermark, w - ww + 5, h - wh + 5, null);// 在src的右下角画入水印  
315             cv.save(Canvas.ALL_SAVE_FLAG);// 保存,用来保存Canvas的状态。save之后,可以调用Canvas的平移、放缩、旋转、错切、裁剪等操作。  
316             cv.restore();// 存储,用来恢复Canvas之前保存的状态。防止save后对Canvas执行的操作对后续的绘制有影响。  
317             return newb;  
318         }  
319     }  
posted @ 2014-07-21 00:12  perfect亮  阅读(312)  评论(0编辑  收藏  举报