Android图片加工

  有时候我们在项目中,需要把图片加工一下,比如说加个圆角,或者打上马赛克或者水印,虽然不是很难的东西,但是没弄过,还是很纠结的,比如像我这样的小白,现在根据网上一些大牛的一些方法,总结了下面这个图片加工厂工具类,可能还有更多的需求,有需要的时候,再去网上找,继续完善中,,直接上跟大家分享代码,注释比较多,而且简单,我就不多说了,直接上跟大家分享代码:

[java]  view plain copy
  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(00, 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, 00, 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(00, bitmap.getWidth(), bitmap.getHeight());  
  265.         final RectF rectF = new RectF(rect);  
  266.         final float roundPx = pixels;  
  267.   
  268.         paint.setAntiAlias(true);  
  269.         canvas.drawARGB(0000);  
  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, 00null);// 在 0,0坐标开始画入src  
  314.         cv.drawBitmap(watermark, w - ww + 5, h - wh + 5null);// 在src的右下角画入水印  
  315.         cv.save(Canvas.ALL_SAVE_FLAG);// 保存,用来保存Canvas的状态。save之后,可以调用Canvas的平移、放缩、旋转、错切、裁剪等操作。  
  316.         cv.restore();// 存储,用来恢复Canvas之前保存的状态。防止save后对Canvas执行的操作对后续的绘制有影响。  
  317.         return newb;  
  318.     }  
  319. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值