Android如何将一张图片裁成圆形/圆角矩形/特殊形状

总体思路如下:

(1)使用canvas先画一层形状层,即最后是要图片裁剪成神马样的
(2)再将paint做如下设置(画两层则取上层和下层的交叉部分,显示上层)
paint.setXfermode(new PorterDuffXfermode(Mode. SRC_IN));
具体这句话是做什么请看:http://407827531.iteye.com/blog/1470519
(3)再使用canvas将图片画进去
(4)canvas的输出的bitmap就是需要的东西啦

关键:如何将.9.png转换成bitmap对象呢?

代码如下:

NinePatchDrawable drawable = (NinePatchDrawable) mContext .getResources().getDrawable(R.drawable. my_shape);
            drawable.setBounds(rect);
            Bitmap first = Bitmap. createBitmap(bitmap.getWidth(), bitmap.getHeight(),
                    Config. ARGB_8888);
            Canvas newCanvas = new Canvas(first);
            drawable.draw(newCanvas);


my_shape.9.png是一张背景透明的有一个特定形状的图形的.9图


最后

整个函数的代码如下:

public static Bitmap getShapedBitmap(Context context, Bitmap bitmap, int pixels) {
        try {
            Bitmap output = Bitmap. createBitmap(bitmap.getWidth(), bitmap.getHeight(),
                    Config. ARGB_8888);
            Canvas canvas = new Canvas(output);
            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;
            NinePatchDrawable drawable = (NinePatchDrawable) context.getResources().getDrawable(R.drawable.my_shape);
            drawable.setBounds(rect);
            Bitmap first = Bitmap. createBitmap(bitmap.getWidth(), bitmap.getHeight(),
                    Config. ARGB_8888);
            Canvas newCanvas = new Canvas(first);
            drawable.draw(newCanvas);
            paint.setAntiAlias( true);
            canvas.drawARGB(0, 0, 0, 0);
            paint.setColor(Color. BLACK);
//          canvas.drawRoundRect(rectF, roundPx, roundPx, paint);//若想切成圆角矩形,则用这句话
            canvas.drawBitmap(first, rect, rectF, paint);//切成特定的形状
            paint.setXfermode( new PorterDuffXfermode(Mode. SRC_IN));
            canvas.drawBitmap(bitmap, rect, rect, paint);
            return output;
        } catch (Exception e) {
            return null;
        }
    }

个人比较懒,就懒得跑程序再截效果图了,由于代码是拿工作中使用代码更改而成,比较粗糙,只此记录一个实现思路。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值