安卓实现多张图片合成或拼接及在图片上添加文字

 这是两张图片,底图+二维码 ,“长按识别二维码”是后添加上去的。

至于为什么不直接放一张带二维码的图片呢,这是公司业务需求,下面来说说怎么实现的(二维码后台返回的是一张正方形图片,后期经过处理成这样的)

public class JointBitmapView extends View {
    private Bitmap bitmap;

    public JointBitmapView(Context context, Bitmap bit1, Bitmap bit2) {
        super(context);
        bitmap = newBitmap(bit1, bit2);
    }

    public JointBitmapView(Context context) {
        super(context);
    }

    public Bitmap makeRoundCorner(Bitmap bitmap, int px) {
        int width = bitmap.getWidth();
        int height = bitmap.getHeight();
        Bitmap output = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(output);
        int color = 0xff424242;
        Paint paint = new Paint();
        Rect rect = new Rect(0, 0, width, height);
        RectF rectF = new RectF(rect);
        paint.setAntiAlias(true);
        canvas.drawARGB(0, 0, 0, 0);
        paint.setColor(color);
        canvas.drawRoundRect(rectF, px, px, paint);
        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
        canvas.drawBitmap(bitmap, rect, rect, paint);
        return output;
    }

    /**
     * 拼接图片
     *
     * @param bit1
     * @param bit2
     * @return 返回拼接后的Bitmap
     */
    public Bitmap newBitmap(Bitmap bit1, Bitmap bit2) {

        bit2 = zoomImg(bit2,240,240);

        int width = bit1.getWidth();
        int height = bit1.getHeight();
        //创建一个空的Bitmap(内存区域),宽度等于第一张图片的宽度,高度等于两张图片高度总和
        Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
        //将bitmap放置到绘制区域,并将要拼接的图片绘制到指定内存区域
        Canvas canvas = new Canvas(bitmap);
        canvas.drawBitmap(bit1, 0, 0, null);
        canvas.drawBitmap(bit2, bit1.getWidth() / 2 - (bit2.getWidth() / 2), bit1.getHeight() / 3 * 2, null);
        //添加文字   长按识别二维码
        Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
        paint.setTextSize(30);
        paint.setStrokeWidth(2);
        paint.setColor(Color.WHITE);
        //在图片上动态的添加文字
        canvas.drawText("长按识别二维码",bit1.getWidth() / 2 - (bit2.getWidth() / 2)+10, bit1.getHeight() / 3 * 2+(bit2.getHeight())+35,paint);
        return bitmap;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawBitmap(bitmap, 0, 0, null);
        bitmap.recycle();
    }

    public Bitmap zoomImg(Bitmap bm, int newWidth, int newHeight) {
        // 获得图片的宽高   
        int width = bm.getWidth();
        int height = bm.getHeight();
        // 计算缩放比例   
        float scaleWidth = ((float) newWidth) / width;
        float scaleHeight = ((float) newHeight) / height;
        // 取得想要缩放的matrix参数   
        Matrix matrix = new Matrix();
        matrix.postScale(scaleWidth, scaleHeight);
        // 得到新的图片   www.2cto.com
        Bitmap newbm = Bitmap.createBitmap(bm, 0, 0, width, height, matrix, true);
        //设置圆角
        newbm = makeRoundCorner(newbm, 250);
        return newbm;
    }

}

里面的注释写的很清楚了,相信大家都能看明白

  new Thread(new Runnable() {
                                @Override
                                public void run() {

                                    try {
                                        for (int i = 0; i < invitePosterBean.getData().size(); i++) {
                                            URL url = new URL(invitePosterBean.getData().get(i).getImg());
                                            InputStream is = url.openStream();
                                            Bitmap bitmap = BitmapFactory.decodeStream(is);
                                            URL url1 = new URL(invitePosterBean.getData().get(i).getLinkUrl());
                                            InputStream is1 = url1.openStream();
                                            Bitmap bitmap2 = BitmapFactory.decodeStream(is1);

                                            /**
                                             * 这里使用BitmapFactory.decodeStream(InputStream is);方法加载图片可以有效的防止
                                             * 当内存过大时出现内存溢出的情况
                                             */

                                            bitmap1 = jonintview.newBitmap(bitmap, bitmap2);
                                            bitmaps.add(bitmap1);
                                        }
                                        handler.sendEmptyMessage(1);
                                    } catch (Exception e) {
                                        e.printStackTrace();
                                    }

                                }
                            }).start();

因为后台返回的图片地址,需要转化成bitmap形式,需要在子线程里面完成。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值