android中图片的处理(绘制圆形,圆角||缩略图)

    /**
     * 圆角处理
     * 
     * @param bitmap
     *            原图
     * @param roundPx
     *            角度
     * @return
     */
    public static Bitmap getCornerBitmap(Bitmap bitmap, float roundPx) {
        if (bitmap == null)
            return null;
        // todo:to prevent memory overflow, suspend the processing of fillet
        // 创建一个指定宽度和高度的空位图对象
        Bitmap output = Bitmap.createBitmap(bitmap.getWidth(),
                bitmap.getHeight(), Config.ARGB_8888);
        // 用该位图创建画布
        Canvas canvas = new Canvas(output);
        // 画笔对象
        final Paint paint = new Paint();
        // 画笔的颜色
        final int color = 0xff424242;
        // 矩形区域对象
        final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
        // 未知
        final RectF rectF = new RectF(rect);
        // 拐角的半径
        roundPx = roundPx == 0 ? (bitmap.getWidth() + bitmap.getHeight()) / 4
                : roundPx;
        // 消除锯齿
        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);
        // 最终在画布上呈现的就是该圆角矩形图片,然后我们返回该Bitmap对象
        return output;
    }

--------------------------------------------------------------------------
    /**
     * 圆形处理
     * 
     * @param bitmap
     *            原图
     * @return
     */
    public static Bitmap getRoundBitmap(Bitmap bitmap) {  
        int width = bitmap.getWidth();  
        int height = bitmap.getHeight();  
        float roundPx;  
        float left, top, right, bottom, dst_left, dst_top, dst_right, dst_bottom;  
        if (width <= height) {  
            roundPx = width / 2;  

            left = 0;  
            top = 0;  
            right = width;  
            bottom = width;  

            height = width;  

            dst_left = 0;  
            dst_top = 0;  
            dst_right = width;  
            dst_bottom = width;  
        } else {  
            roundPx = height / 2;  

            float clip = (width - height) / 2;  

            left = clip;  
            right = width - clip;  
            top = 0;  
            bottom = height;  
            width = height;  

            dst_left = 0;  
            dst_top = 0;  
            dst_right = height;  
            dst_bottom = height;  
        }  

        Bitmap output = Bitmap.createBitmap(width, height, Config.ARGB_8888);  
        Canvas canvas = new Canvas(output);  

        final Paint paint = new Paint();  
        final Rect src = new Rect((int) left, (int) top, (int) right, (int) bottom);  
        final Rect dst = new Rect((int) dst_left, (int) dst_top, (int) dst_right, (int) dst_bottom);  
        final RectF rectF = new RectF(dst);  

        paint.setAntiAlias(true);// 设置画笔无锯齿  

        canvas.drawARGB(0, 0, 0, 0); // 填充整个Canvas  

        // 以下有两种方法画圆,drawRounRect和drawCircle  
        canvas.drawRoundRect(rectF, roundPx, roundPx, paint);// 画圆角矩形,第一个参数为图形显示区域,第二个参数和第三个参数分别是水平圆角半径和垂直圆角半径。  
        // canvas.drawCircle(roundPx, roundPx, roundPx, paint);  

        paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));// 设置两张图片相交时的模式,参考http://www.cnblogs.com/rayray/p/3670120.html  
        canvas.drawBitmap(bitmap, src, dst, paint); // 以Mode.SRC_IN模式合并bitmap和已经draw了的Circle  

        return output;  
    }  


-------------------------------------------------------------------------------0
    /**
     * 缩略图
     * 
     * @param bitmap
     *            原图
     * @param thumbnailWidth
     *            压缩宽
     * @param thumbnailHeight
     *            压缩高
     * @return
     */
    public static final Bitmap cropBitmap(final Bitmap bitmap,
            final int thumbnailWidth, final int thumbnailHeight) {
        if (bitmap == null)
            return null;
        final int width = bitmap.getWidth();
        final int height = bitmap.getHeight();
        int focusX = width / 2;
        int focusY = height / 2;
        int cropX;
        int cropY;
        int cropWidth;
        int cropHeight;
        float scaleFactor;
        if (thumbnailWidth * height < thumbnailHeight * width) {
            // Vertically constrained.
            cropWidth = thumbnailWidth * height / thumbnailHeight;
            cropX = Math.max(0,
                    Math.min(focusX - cropWidth / 2, width - cropWidth));
            cropY = 0;
            cropHeight = height;
            scaleFactor = (float) thumbnailHeight / height;
        } else {
            // Horizontally constrained.
            cropHeight = thumbnailHeight * width / thumbnailWidth;
            cropY = Math.max(0,
                    Math.min(focusY - cropHeight / 2, height - cropHeight));
            cropX = 0;
            cropWidth = width;
            scaleFactor = (float) thumbnailWidth / width;
        }
        final Bitmap finalBitmap = Bitmap.createBitmap(thumbnailWidth,
                thumbnailHeight, Bitmap.Config.RGB_565);
        final Canvas canvas = new Canvas(finalBitmap);
        final Paint paint = new Paint();
        paint.setDither(true);
        paint.setFilterBitmap(true);
        canvas.drawColor(0);
        canvas.drawBitmap(bitmap, new Rect(cropX, cropY, cropX + cropWidth,
                cropY + cropHeight), new Rect(0, 0, thumbnailWidth,
                thumbnailHeight), paint);
        bitmap.recycle();

        // Store (long thumbnailId, short focusX, short focusY, JPEG data).
        final ByteArrayOutputStream cacheOutput = new ByteArrayOutputStream(
                16384);
        final DataOutputStream dataOutput = new DataOutputStream(cacheOutput);
        // byte[] retVal = null;
        try {
            dataOutput.writeShort((int) ((focusX - cropX) * scaleFactor));
            dataOutput.writeShort((int) ((focusY - cropY) * scaleFactor));
            dataOutput.flush();
            finalBitmap.compress(Bitmap.CompressFormat.JPEG, 80, cacheOutput);
            // retVal = cacheOutput.toByteArray();
            cacheOutput.close();
            // finalBitmap.recycle();
        } catch (Exception e) {
            ;
        }
        return finalBitmap;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值