美文网首页
Canvas.drawBitmap(Bitmap bitmap,

Canvas.drawBitmap(Bitmap bitmap,

作者: moushao | 来源:发表于2017-11-10 10:56 被阅读173次

    这次的项目需求是,截取视频的某一帧为底图,与暂停按钮合成一个视频缩略图.

    由于我是半路出家,自学的.野路子多,bitmap根本不怎么了解,看的最多的无非也就是用完了要记得回收(此处有捂脸的表情)

    为了将两个图片合成为一个,着实搞了很久,后来发现不难,其实就是自己没有理解各个参数的意义而已.汗颜!!!为了以后再用而不至于又到处百度,打脸留更

        /**
     * 把两个位图覆盖合成为一个位图,以底层位图的长宽为基准
     *
     * @param backBitmap  在底部的位图
     * @param frontBitmap 盖在上面的位图
     * @return
     */
    public static Bitmap mergeBitmap(Bitmap backBitmap, Bitmap frontBitmap) {
    
        if (backBitmap == null || backBitmap.isRecycled()
                || frontBitmap == null || frontBitmap.isRecycled()) {
            return null;
        }
        Bitmap bitmap = backBitmap.copy(Bitmap.Config.ARGB_8888, true);
        Canvas canvas = new Canvas(bitmap);
        //        Rect baseRect = new Rect(0, 0, backBitmap.getWidth(), backBitmap.getHeight());
        // 计算左边位置  
        int left = (backBitmap.getWidth() - frontBitmap.getWidth()) / 2;
        // 计算上边位置  
        int top = (backBitmap.getHeight() - frontBitmap.getHeight()) / 2;
        //从什么位置开始画
        Rect baseRect = new Rect(left, top, left + frontBitmap.getWidth(), top + frontBitmap.getHeight());
        //画那些区域的内容
        Rect frontRect = new Rect(0, 0, frontBitmap.getWidth(), frontBitmap.getHeight());
        canvas.drawBitmap(frontBitmap, frontRect, baseRect, null);
        backBitmap.recycle();
        frontBitmap.recycle();
        return bitmap;
    }
    

    这里着重需要理解的是baseRect 和frontRect 两个变量.我们先做一个底图看看:
    如图所示,蓝色的baseRect和黄色frontRect两个bitmap,最终合成这一个图片.


    图片.png

    首先,我们需要先把backBitmap生成为一个底板,就好比画画的时候,我们需要的画布.
    Canvas canvas = new Canvas(bitmap);
    此时相当于第一张backBitmap已经画在画板上了.重要的是第二个frontBitmap.

    其次,我们要告诉他,第二个图我要画在哪个位置,我又要画那些第二张图的那些区域内容.
    首先,我使用baseRect 来告诉我们要在画板最居中的位置,由上图可知,我们的画板(底图)是500500,frontBitmap是500200,所以我们左上右下的参数就应该为

    letf = (500 - 200)/2;
    top = (500 - 200)/2;
    right = (500 - 200)/2+200;
    bottom = (500 - 200)/2+200;
    Rect baseRect = new Rect(left, top, right, buttom);

    然后,我要选择画frontBitmap那些区域的内容,因为我们是画整个frontBitmap,不需要裁剪,所以:

    Rect frontRect = new Rect(0, 0, frontBitmap.getWidth(), frontBitmap.getHeight());

    最后,画板,要画的资源,画资源的那些部分都有了,一步合成:

    canvas.drawBitmap(frontBitmap, frontRect, baseRect, null);.

    碎碎念:

    1 按照这个道理,可以扩展bitmap的任意姿势拼接以及任意大小的剪辑
    2个人觉得这个还是着实麻烦,绕来绕去的
    3 最后用完别忘了释放(捂脸)
    更多问题加群:584275290

    相关文章

      网友评论

          本文标题:Canvas.drawBitmap(Bitmap bitmap,

          本文链接:https://www.haomeiwen.com/subject/coovmxtx.html