根据Path对Bitmap进行截取
2016-04-26 17:14
567 查看
利用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到图形所在画布上即可。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件