Android之图片处理

转自点击打开链接(http://www.2cto.com/kf/201210/162114.html)

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

[java]
/**
 * 图片加工厂
 * 
 * @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; 
    } 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值