Android bitmap合成图片

//根据项目需要,在一张图片上合成另一张图片(压缩后的),显示到预览图的imageview上,然后分享出去

大致思路:1,获取网络图片,计算宽高

  2,预定于压缩后图片的宽高(也可是相对屏幕宽高的百分比,方便适配)

  3,进行缩放bitmapB

  4,创建合成后的图片bitmapC

  5,创建底部本地图片的bitmapA

  6,把bitmapA和bitmapB用画笔画到bitmapC上

  7,然后用message通知handler显示到预览图上

,,,,,,,,下面是具体实现代码,,,,,,,,,,,,,,,,,,,,,,


在onCreate方便实现

new Thread(new Runnable() {
    @Override
    public void run() {
        //创建一个message
        //设置what字段的值为UPDATE_TEXT,主要是为了区分不同的message
        //设置message.obj的内容
        //调用Handler的message对象
        //handler中的handlermessage对象是在主线程中运行的
        Message message = new Message();
        message.what = UPDATE_TEXT;
        message.obj = compositeImages();
        handler.sendMessage(message);


    }
}).start();

下面是handler更新UI

private Handler handler = new Handler() {

    public void handleMessage(Message msg) {
        switch (msg.what) {
            case UPDATE_TEXT:
                //在这里可以进行UI操作
                //对msg.obj进行String强制转换
                Bitmap a = (Bitmap) msg.obj;
                // 微信分享
                bitmap=a;
                share_iv.setImageBitmap(a);
                    break;
        }
    }

};

然后是分享,

@OnClick({ R.id.toolbar_back,R.id.toolbar_share})
public void onClick(View view) {
    switch (view.getId()){
        case R.id.toolbar_back:
            this.finish();
            break;
        case R.id.toolbar_share:
            shareAction.open();
            break;
    }
}


private ShareAction shareAction = new ShareAction(ShareActivity.this)
        .setDisplayList(SHARE_MEDIA.WEIXIN,SHARE_MEDIA.WEIXIN_CIRCLE)
        .setShareboardclickCallback(new ShareBoardlistener() {
            @Override
            public void onclick(SnsPlatform snsPlatform, SHARE_MEDIA share_media) {
                UMImage image = new UMImage(ShareActivity.this, bitmap);//本地文件
                String uid=LocalStorage.get("user_id").toString();
                int l=uid.length();
                
                String string="我是的第"+uid+"个用户";
                switch (share_media) {
                    case WEIXIN:
                        new ShareAction(ShareActivity.this).setPlatform(share_media).setCallback(shareListener)
                                .withText(string)
                                .withMedia(image)
                                .setCallback(shareListener)
                                .share();
                        break;
                    case WEIXIN_CIRCLE:
                        new ShareAction(ShareActivity.this).setPlatform(share_media).setCallback(shareListener)
                                .withText(string)
                                .withMedia(image)
                                .setCallback(shareListener)
                                .share();
                        break;

                }
            }
        });

private UMShareListener shareListener = new UMShareListener() {
    /**
     * @descrption 分享开始的回调
     * @param platform 平台类型
     */
    @Override
    public void onStart(SHARE_MEDIA platform) {

    }

    /**
     * @descrption 分享成功的回调
     * @param platform 平台类型
     */
    @Override
    public void onResult(SHARE_MEDIA platform) {
        MobclickAgent.onEvent(getApplicationContext(), "share");

        //获取是否是今天抽奖
        String upLoad_day=mStoreUtils.getUserUploadLuckDate();
        SimpleDateFormat sf = new SimpleDateFormat("yyyyMMdd");
        Date now = new Date();
        String nowDay = sf.format(now);
        mStoreUtils.setUserShareDate(nowDay);
        if (nowDay.equals(upLoad_day)){
           int share_time= mStoreUtils.getUnreadMsgShare();
            if (share_time<2){
                int luck_time=mStoreUtils.getSumLuck();
                mStoreUtils.setSumLuck(luck_time-2);
                mStoreUtils.setSumLuckShare(share_time+1);
            }else {

            }

        }else {
            mStoreUtils.setSumLuckShare(0);
            int luck_time=mStoreUtils.getSumLuck();
            mStoreUtils.setSumLuck(luck_time-2);
            mStoreUtils.setUserUploadLuckDate(nowDay);
        }

    }

    /**
     * @descrption 分享失败的回调
     * @param platform 平台类型
     * @param t 错误原因
     */
    @Override
    public void onError(SHARE_MEDIA platform, Throwable t) {
    }

    /**
     * @descrption 分享取消的回调
     * @param platform 平台类型
     */
    @Override
    public void onCancel(SHARE_MEDIA platform) {

    }
};


最后是被问的重点-合成图片

 private Bitmap compositeImages(){
        String ph= LocalStorage.get("avatar").toString();
        System.out.println("ph:="+ph);
        Bitmap dstBitmap=getBitmapFromUri(ph);
        //获取这个图片的宽和高
        int width = dstBitmap.getWidth();
        int height = dstBitmap.getHeight();
//定义预转换成的图片的宽度和高度
        DisplayMetrics dm = new DisplayMetrics();
         //获取屏幕信息
         getWindowManager().getDefaultDisplay().getMetrics(dm);
         int screenWidth = dm.widthPixels;
        int newWidth = screenWidth/7;
        int newHeight = screenWidth/7;

        //计算缩放率,新尺寸除原始尺寸
        float scaleWidth = ((float) newWidth) / width;
        float scaleHeight = ((float) newHeight) / height;

        // 创建操作图片用的matrix对象
        Matrix matrix = new Matrix();
        // 缩放图片动作
        matrix.postScale(scaleWidth, scaleHeight);
// 创建新的图片
        Bitmap resizedBitmap = Bitmap.createBitmap(dstBitmap, 0, 0,
                width, height, matrix, true);
//        Bitmap dstBitmap=BitmapFactory.decodeResource(getResources(), R.mipmap.news_pressed);
        Bitmap srcBitmap= BitmapFactory.decodeResource(getResources(), R.mipmap.start_page1_share);
        Bitmap bmp = null;
        //下面这个Bitmap中创建的函数就可以创建一个空的Bitmap
        System.out.println("srcBitmap.getWidth():="+srcBitmap);
        bmp = Bitmap.createBitmap(srcBitmap.getWidth(), srcBitmap.getHeight(), srcBitmap.getConfig());
        Paint paint = new Paint();
        Canvas canvas = new Canvas(bmp);
        //首先绘制第一张图片,很简单,就是和方法中getDstImage一样

        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OVER));
        canvas.drawBitmap(resizedBitmap, 20, 10, paint);
        paint.setTextSize(getResources().getDimensionPixelSize(R.dimen.set_text_size));
        String uid=LocalStorage.get("user_id").toString();
        int l=uid.length();
        if (l<7)
        {
            if (l==3){
                uid="1111"+uid;
            }else if(l==4){
                uid="111"+uid;
            }else if(l==5){
                uid="11"+uid;
            }else if(l==6){
                uid="1"+uid;
            }

        }
        String string="我是第"+uid+"个用户";
        canvas.drawText( string,srcBitmap.getWidth()/3, screenWidth/13,paint );

        canvas.drawBitmap(srcBitmap, 0, 0, paint);

        //在绘制第二张图片的时候,我们需要指定一个Xfermode
        //这里采用Multiply模式,这个模式是将两张图片的对应的点的像素相乘
        //,再除以255,然后以新的像素来重新绘制显示合成后的图像


        return bmp;
    }
    private Bitmap getBitmapFromUri(String uri) {
        Bitmap map = null;
        try {
            // 读取uri所在的图片
//            Bitmap bitmap = MediaStore.Images.Media.getBitmap(SetActivity.this.getContentResolver(), uri);
            URL url = new URL(uri);
            URLConnection conn = url.openConnection();
            conn.connect();
            InputStream in;
            in = conn.getInputStream();
            map = BitmapFactory.decodeStream(in);
            // TODO Auto-generated catch block
            return map;
        } catch (Exception e) {
            System.out.println("eeeeeeeeeee:="+e);
            e.printStackTrace();
            return null;
        }
    }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值