美文网首页
根据Path对Bitmap进行截取

根据Path对Bitmap进行截取

作者: NemoHo | 来源:发表于2017-01-05 19:12 被阅读0次

    利用Path对Bitmap进行截取

    方式1:

    mRectPath为一条现有的path
    Path bitmap_path = new Path();
    bitmap_path.moveTo(mPoints.get(0).x-width/2+LINE_WIDTH/2,mPoints.get(0).y-height+LINE_WIDTH/2);
    bitmap_path.lineTo(mPoints.get(0).x+width/2-LINE_WIDTH/2,mPoints.get(0).y-height+LINE_WIDTH/2);
    bitmap_path.lineTo(mPoints.get(0).x+width/2-LINE_WIDTH/2,mPoints.get(0).y-LINE_WIDTH/2);
    bitmap_path.lineTo(mPoints.get(0).x-width/2+LINE_WIDTH/2,mPoints.get(0).y-LINE_WIDTH/2);
    bitmap_path.close();
    if(bitmap_path.op(mRectPath,Op.INTERSECT)){
        paint.setStyle(Paint.Style.FILL);
        bmpCanvas.drawPath(bitmap_path, paint);
        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
        bmpCanvas.drawBitmap(target, mPoints.get(0).x-width/2,mPoints.get(0).y-height, paint);
    }else{
        bmpCanvas.drawBitmap(target, mPoints.get(0).x-width/2,mPoints.get(0).y-height, paint);                  
    }
    

    问题:

    在同一个画布上绘制原本的图形以及截取后的bitmap
    需要先对bitmap进行截取绘制,然后再绘制原本的图形,否则使用setXfermode操作会出错
    

    方式2:

    //绘制路线
    bmpCanvas.drawPath(mRectPath,paint);
    //create 100,100 bitmap
    Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
    int width = mBufferBmpRect.width();
    int height =  mBufferBmpRect.height();
    
    
    Bitmap target = Bitmap.createBitmap(width, height, bitmap.getConfig());
    Canvas temp_canvas = new Canvas(target);
    
    //TODO 做截取操作
    Path bitmap_path = new Path();
    bitmap_path.moveTo(mPoints.get(0).x-bitmap.getWidth()/2+LINE_WIDTH/2,mPoints.get(0).y-bitmap.getHeight()+LINE_WIDTH/2);
    bitmap_path.lineTo(mPoints.get(0).x+bitmap.getWidth()/2-LINE_WIDTH/2,mPoints.get(0).y-bitmap.getHeight()+LINE_WIDTH/2);
    bitmap_path.lineTo(mPoints.get(0).x+bitmap.getWidth()/2-LINE_WIDTH/2,mPoints.get(0).y-LINE_WIDTH/2);
    bitmap_path.lineTo(mPoints.get(0).x-bitmap.getWidth()/2+LINE_WIDTH/2,mPoints.get(0).y-LINE_WIDTH/2);
    bitmap_path.close();
    if(bitmap_path.op(mRectPath,Op.INTERSECT)){
        paint.setStyle(Paint.Style.FILL);
        temp_canvas.drawPath(bitmap_path, paint);
        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
        temp_canvas.drawBitmap(bitmap,mPoints.get(0).x-bitmap.getWidth()/2,mPoints.get(0).y-bitmap.getHeight(), paint);     
    //                  bmpCanvas.drawPath(bitmap_path, paint);
    //                  bmpCanvas.drawBitmap(target, mPoints.get(0).x-width/2,mPoints.get(0).y-height, paint);
    }else{
        temp_canvas.drawBitmap(bitmap,mPoints.get(0).x-bitmap.getWidth()/2,mPoints.get(0).y-bitmap.getHeight(), null);      
    //                  bmpCanvas.drawBitmap(target, mPoints.get(0).x-width/2,mPoints.get(0).y-height, paint);
    }
    
    //TODO 去除Xfermode
    paint.setXfermode(null);
    bmpCanvas.drawBitmap(target, 0,0, paint);
    

    思路:

    先绘制图形
    创建一个跟原本图形所在画布一样大的bitmap
    在该bitmap上绘制需要被截取的bitmap同时将其截取
    将bitmap绘制到图形所在bitmap上
    

    优点:

    最终得到的bitmap就是一个等大的bitmap,且该bitmap上
    只有被截取后剩余的一部分bitmap
    

    实现步骤:

    1.获取到原路径的RectPath。
    2.得到需要被截取的bitmap。
    3.得到显示区域的大小。
    4.得到路径起点。
    5.根据起点以及bitmap的大小创建一个bitmapPath代表bitmap所占区域。
    6.将rectPath与bitmapPath进行op运算。
    7.如果有相交:
        1.绘制相交运算后的bitmapPath。
        2.setXfermode(SRC_IN)。
        3.再绘制bitmap,使用指定的paint。
    8.如果没有相交:
        直接绘制bitmap到图形所在画布上即可。

    相关文章

      网友评论

          本文标题:根据Path对Bitmap进行截取

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