zoukankan      html  css  js  c++  java
  • Android之小小图片加工厂

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

    /** 
     * 图片加工厂 
     *  
     * @author way 
     *  
     */  
    public class ImageUtil {  
        /** 
         * 通过路径获取输入流 
         *  
         * @param path 
         *            路径 
         * @return 输入流 
         * @throws Exception 
         *             异常 
         */  
        public static InputStream getRequest(String path) throws Exception {  
            URL url = new URL(path);  
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();  
            conn.setRequestMethod("GET");  
            conn.setConnectTimeout(5000);  
            if (conn.getResponseCode() == 200) {  
                return conn.getInputStream();  
            }  
            return null;  
        }  
      
        /** 
         * 从流中读取二进制数据 
         *  
         * @param inStream 
         *            输入流 
         * @return 二进制数据 
         * @throws Exception 
         *             异常 
         */  
        public static byte[] readInputStream(InputStream inStream) throws Exception {  
            ByteArrayOutputStream outSteam = new ByteArrayOutputStream();  
            byte[] buffer = new byte[4096];  
            int len = 0;  
            while ((len = inStream.read(buffer)) != -1) {  
                outSteam.write(buffer, 0, len);  
            }  
            outSteam.close();  
            inStream.close();  
            return outSteam.toByteArray();  
        }  
      
        /** 
         * 把一个路径转换成Drawable对象 
         *  
         * @param url 
         *            路径 
         * @return Drawable对象 
         */  
        public static Drawable loadImageFromUrl(String url) {  
            URL m;  
            InputStream i = null;  
            try {  
                m = new URL(url);  
                i = (InputStream) m.getContent();  
            } catch (MalformedURLException e1) {  
                e1.printStackTrace();  
            } catch (IOException e) {  
                e.printStackTrace();  
            }  
            Drawable d = Drawable.createFromStream(i, "src");  
            return d;  
        }  
      
        /** 
         * 把一个路径转换成Drawable对象 
         *  
         * @param url 
         *            字符串路径 
         * @return Drawable对象 
         * @throws Exception 
         *             异常 
         */  
        public static Drawable getDrawableFromUrl(String url) throws Exception {  
            return Drawable.createFromStream(getRequest(url), null);  
        }  
      
        /** 
         * 从路径中得到位图 
         *  
         * @param url 
         *            字符串路径 
         * @return 位图 
         * @throws Exception 
         *             异常 
         */  
        public static Bitmap getBitmapFromUrl(String url) throws Exception {  
            byte[] bytes = getBytesFromUrl(url);  
            return byteToBitmap(bytes);  
        }  
      
        /** 
         * 从路径中得到圆角位图 
         *  
         * @param url 
         *            字符串路径 
         * @param pixels 
         *            圆角弧度 
         * @return 圆角位图 
         * @throws Exception 
         *             异常 
         */  
        public static Bitmap getRoundBitmapFromUrl(String url, int pixels)  
                throws Exception {  
            byte[] bytes = getBytesFromUrl(url);  
            Bitmap bitmap = byteToBitmap(bytes);  
            return toRoundCorner(bitmap, pixels);  
        }  
      
        /** 
         * 从路径中得到圆角Drawable对象 
         *  
         * @param url 
         *            字符串路径 
         * @param pixels 
         *            圆角弧度 
         * @return 圆角Drawable对象 
         * @throws Exception 
         *             异常 
         */  
        public static Drawable geRoundDrawableFromUrl(String url, int pixels)  
                throws Exception {  
            byte[] bytes = getBytesFromUrl(url);  
            BitmapDrawable bitmapDrawable = (BitmapDrawable) byteToDrawable(bytes);  
            return toRoundCorner(bitmapDrawable, pixels);  
        }  
      
        /** 
         * 从路径中得到二进制数据 
         *  
         * @param url 
         *            字符串路径 
         * @return 二进制数据 
         * @throws Exception 
         *             异常 
         */  
        public static byte[] getBytesFromUrl(String url) throws Exception {  
            return readInputStream(getRequest(url));  
        }  
      
        /** 
         * 从二进制数据中得到位图 
         *  
         * @param byteArray 
         *            二进制数据 
         * @return 位图 
         */  
        public static Bitmap byteToBitmap(byte[] byteArray) {  
            if (byteArray.length != 0) {  
                return BitmapFactory  
                        .decodeByteArray(byteArray, 0, byteArray.length);  
            } else {  
                return null;  
            }  
        }  
      
        /** 
         * 从二进制数据中得到Drawable对象 
         *  
         * @param byteArray 
         *            二进制数据 
         * @return Drawable对象 
         */  
        public static Drawable byteToDrawable(byte[] byteArray) {  
            ByteArrayInputStream ins = new ByteArrayInputStream(byteArray);  
            return Drawable.createFromStream(ins, null);  
        }  
      
        /** 
         * 把位图转换称二进制数据 
         *  
         * @param bm 
         *            位图 
         * @return 二进制数据 
         */  
        public static byte[] Bitmap2Bytes(Bitmap bm) {  
            ByteArrayOutputStream baos = new ByteArrayOutputStream();  
            bm.compress(Bitmap.CompressFormat.PNG, 100, baos);  
            return baos.toByteArray();  
        }  
      
        /** 
         * 把Drawable对象转换称位图 
         *  
         * @param drawable 
         *            Drawable对象 
         * @return 位图 
         */  
        public static Bitmap drawableToBitmap(Drawable drawable) {  
      
            Bitmap bitmap = Bitmap  
                    .createBitmap(  
                            drawable.getIntrinsicWidth(),  
                            drawable.getIntrinsicHeight(),  
                            drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888  
                                    : Bitmap.Config.RGB_565);  
            Canvas canvas = new Canvas(bitmap);  
            drawable.setBounds(0, 0, drawable.getIntrinsicWidth(),  
                    drawable.getIntrinsicHeight());  
            drawable.draw(canvas);  
            return bitmap;  
        }  
      
        /** 
         * 图片去色,返回灰度图片 
         *  
         * @param bmpOriginal 
         *            传入的图片 
         * @return 去色后的图片 
         */  
        public static Bitmap toGrayscale(Bitmap bmpOriginal) {  
            int width, height;  
            height = bmpOriginal.getHeight();  
            width = bmpOriginal.getWidth();  
      
            Bitmap bmpGrayscale = Bitmap.createBitmap(width, height,  
                    Bitmap.Config.RGB_565);  
            Canvas c = new Canvas(bmpGrayscale);  
            Paint paint = new Paint();  
            ColorMatrix cm = new ColorMatrix();  
            cm.setSaturation(0);  
            ColorMatrixColorFilter f = new ColorMatrixColorFilter(cm);  
            paint.setColorFilter(f);  
            c.drawBitmap(bmpOriginal, 0, 0, paint);  
            return bmpGrayscale;  
        }  
      
        /** 
         * 去色同时加圆角 
         *  
         * @param bmpOriginal 
         *            原图 
         * @param pixels 
         *            圆角弧度 
         * @return 修改后的图片 
         */  
        public static Bitmap toGrayscale(Bitmap bmpOriginal, int pixels) {  
            return toRoundCorner(toGrayscale(bmpOriginal), pixels);  
        }  
      
        /** 
         * 把位图变成圆角位图 
         *  
         * @param bitmap 
         *            需要修改的位图 
         * @param pixels 
         *            圆角的弧度 
         * @return 圆角位图 
         */  
        public static Bitmap toRoundCorner(Bitmap bitmap, int pixels) {  
      
            Bitmap output = Bitmap.createBitmap(bitmap.getWidth(),  
                    bitmap.getHeight(), Config.ARGB_8888);  
            Canvas canvas = new Canvas(output);  
      
            final int color = 0xff424242;  
            final Paint paint = new Paint();  
            final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());  
            final RectF rectF = new RectF(rect);  
            final float roundPx = pixels;  
      
            paint.setAntiAlias(true);  
            canvas.drawARGB(0, 0, 0, 0);  
            paint.setColor(color);  
            canvas.drawRoundRect(rectF, roundPx, roundPx, paint);  
      
            paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));  
            canvas.drawBitmap(bitmap, rect, rect, paint);  
      
            return output;  
        }  
      
        /** 
         * 将BitampDrawable转换成圆角的BitampDrawable 
         *  
         * @param bitmapDrawable 
         *            原生BitampDrawable对象 
         * @param pixels 
         *            圆角弧度 
         * @return 圆角BitampDrawable对象 
         */  
        public static BitmapDrawable toRoundCorner(BitmapDrawable bitmapDrawable,  
                int pixels) {  
            Bitmap bitmap = bitmapDrawable.getBitmap();  
            bitmapDrawable = new BitmapDrawable(toRoundCorner(bitmap, pixels));  
            return bitmapDrawable;  
        }  
      
        /** 
         * 图片水印生成的方法 
         *  
         * @param src 
         *            源图片位图 
         * @param watermark 
         *            水印图片位图 
         * @return 返回一个加了水印的图片 
         */  
        public static Bitmap createBitmap(Bitmap src, Bitmap watermark) {  
            if (src == null)  
                return null;  
            int w = src.getWidth();  
            int h = src.getHeight();  
            int ww = watermark.getWidth();  
            int wh = watermark.getHeight();  
            Bitmap newb = Bitmap.createBitmap(w, h, Config.ARGB_8888);// 创建一个新的和SRC长度宽度一样的位图  
            Canvas cv = new Canvas(newb);// 初始化画布  
            cv.drawBitmap(src, 0, 0, null);// 在 0,0坐标开始画入src  
            cv.drawBitmap(watermark, w - ww + 5, h - wh + 5, null);// 在src的右下角画入水印  
            cv.save(Canvas.ALL_SAVE_FLAG);// 保存,用来保存Canvas的状态。save之后,可以调用Canvas的平移、放缩、旋转、错切、裁剪等操作。  
            cv.restore();// 存储,用来恢复Canvas之前保存的状态。防止save后对Canvas执行的操作对后续的绘制有影响。  
            return newb;  
        }  
    }

    转  http://blog.csdn.net/weidi1989/article/details/8088309

  • 相关阅读:
    Creating a generic Web Parts for hosting ASP.NET User Controls
    Speed Up SQL Server Apps 提高SQL Server应用程序的运行效率 (Part 1)
    How to use CreateChildContorls method inherited from System.Web.UI.Control
    How to quickly access Web Part Management Page
    SQL Script tips for MS SQL Server
    How to enable single signon service on the SPS
    A brief summary of UML & Rational Rose – Use Case Diagram, Part II
    Borland Together for Visual Studio.Net V2.0 安装问题
    Speed Up SQL Server Apps 提高SQL Server应用程序的运行效率 (Part 2)
    体验ReSharper V1.0 for VS.Net 2003 Part I
  • 原文地址:https://www.cnblogs.com/622698abc/p/2784197.html
Copyright © 2011-2022 走看看