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 }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。