首页 > 代码库 > android 工具类之图片加工

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 =http://www.mamicode.com/= 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     }