网站首页 编程语言 正文
本文实例为大家分享了Android实现手势划定区域裁剪图片的具体代码,供大家参考,具体内容如下
需求:
拍照,然后对图片进行处理,划定矩形区域,将矩形区域裁剪下来
思路:
1、使用系统相机拍照,拍完返回,对图片进行压缩和存储。
2、新建一个activity处理图片裁剪,利用自定义view在画布上画出矩形区域。
3、根据坐标信息生成裁剪图片并存储。
部分核心代码:
1、调用系统相机拍照
String IMAGE_PATH = Environment.getExternalStorageDirectory().getPath()+ "/com.kwmax.demo/Image/";
String filename = "xxxxxx.jpeg";
File picFile = new File(IMAGE_PATH + filename);
if (!picFile.exists()) {
picFile.createNewFile();
}
...
if(getContext().getPackageManager().getLaunchIntentForPackage("com.sec.android.app.camera") != null) {
cameraIntent.setPackage("com.sec.android.app.camera");
}
if (getContext().getPackageManager().getLaunchIntentForPackage("com.android.hwcamera") != null) {
cameraIntent.setPackage("com.android.hwcamera");
}
if (getContext().getPackageManager().getLaunchIntentForPackage("com.zte.camera") != null) {
cameraIntent.setPackage("com.zte.camera");
}
cameraIntent.setAction(MediaStore.ACTION_IMAGE_CAPTURE); // 默认系统相机
cameraIntent.addCategory("android.intent.category.DEFAULT");
Uri pictureUri = Uri.fromFile(picFile);
cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, pictureUri);
startActivityForResult(intent, CAMERA_REQUEST_CODE);
2、自定义手势矩形view
public class CaptureRectView extends View {
private int x;
private int y;
private int m;
private int n;
private boolean sign;//绘画标记位
private Paint paint;//画笔
public CaptureRectView (Context context) {
super(context);
paint = new Paint(Paint.FILTER_BITMAP_FLAG);
}
@Override
protected void onDraw(Canvas canvas) {
if(sign){
paint.setColor(Color.TRANSPARENT);
}else{
paint.setColor(Color.RED);
paint.setAlpha(80);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(15f);
canvas.drawRect(new Rect(x, y, m, n), paint);
}
super.onDraw(canvas);
}
public void setSeat(int x,int y,int m,int n){
this.x = x;
this.y = y;
this.m = m;
this.n = n;
}
public boolean isSign() {
return sign;
}
public void setSign(boolean sign) {
this.sign = sign;
}
}
3、裁剪页面布局
<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/drawrect_framelayout" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@color/black" android:clickable="true" android:orientation="vertical"> <RelativeLayout android:id="@+id/drawrect_relativelayout" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@color/black" android:orientation="vertical"> <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent" android:layout_above="@+id/bottom"> <LinearLayout android:id="@+id/image_zoom_view_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_centerInParent="true" android:gravity="center" android:orientation="vertical"/> <ImageView android:id="@+id/capture_preview" android:layout_width="80dp" android:layout_height="80dp"/> </FrameLayout> <LinearLayout android:id="@+id/bottom" android:layout_width="fill_parent" android:layout_height="50dip" android:layout_alignParentBottom="true" android:orientation="horizontal" android:layout_marginLeft="10dp" android:layout_marginRight="10dp"> <Button android:id="@+id/btn_capture" android:layout_width="50dp" android:layout_height="wrap_content" android:layout_weight="1" android:layout_marginRight="10dp" android:text="裁剪"/> <Button android:id="@+id/btn_cancel" android:layout_width="50dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="取消"/> </LinearLayout> </RelativeLayout> </FrameLayout>
4、裁剪activity
public class DrawRectActivity extends BasicActivity implements OnClickListener, View.OnTouchListener {
private String TAG = "DrawRectActivity";
private String imageString;
private String imagePath;
private ArrayList<String> imageList = null;
private int position = 0;
private int width, height;
private LinearLayout layerViewLayout = null;
private ImageView aiPreview;
private CaptureRectView captureView;//绘画选择区域
private int capX;//绘画开始的横坐标
private int capY;//绘画开始的纵坐标
private int capM;//绘画结束的横坐标
private int capN;//绘画结束的纵坐标
private Bitmap captureBitmap;
private Button cancel;
private Button aiCapture;
private FrameLayout frameLayout;
private RelativeLayout relativeLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
init();
initUI();
}
private void init() {
width = ImageUtils.getScreenWidth(this);
height = ImageUtils.getScreenHeight(this);
Intent intent = this.getIntent();
Bundle bundle = intent.getExtras();
imageString = bundle.getString("imageString");
imagePath = bundle.getString("imagePath");
position = bundle.getInt("position");
imageList = parseImageString(imagePath, imageString);
}
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
private void initUI() {
setContentView(R.layout.draw_image_rect_view);
frameLayout = (FrameLayout) findViewById(R.id.drawrect_framelayout);
relativeLayout = (RelativeLayout) findViewById(R.id.drawrect_relativelayout);
layerViewLayout = (LinearLayout) this.findViewById(R.id.image_zoom_view_layout);
btncancel = (Button) findViewById(R.id.btn_cancel);
btnCapture = (Button) findViewById(R.id.btn_capture);
btnPreview = (ImageView) findViewById(R.id.capture_preview);
ImageView originImage = new ImageView(this);
Bitmap image = ImageUtils.getBitmapFromFile(imagePath + imageList.get(position), 1);
originImage.setImageBitmap(image);
originImage.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
layerViewLayout.addView(originImage, new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
captureView = new CaptureRectView(this);
originImage.setOnTouchListener(this);
this.addContentView(captureView, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
if (frameLayout.isClickable()) {
frameLayout.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
}
});
}
btncancel.setOnClickListener(this);
btnCapture.setOnClickListener(this);
}
private ArrayList<String> parseImageString(String imagePath, String imageString) {
ArrayList<String> list = new ArrayList<String>();
String allFiles = imageString.substring(imageString.indexOf("img://") + "img://".length());
String fileName = null;
while (allFiles.indexOf(";") > 0) {
fileName = allFiles.substring(0, allFiles.indexOf(";"));
allFiles = allFiles.substring(allFiles.indexOf(";") + 1);
if (checkIsImageFile(fileName) && new File(imagePath + fileName).exists()) {
list.add(fileName);
Log.v("ParseImageString()", "imageName=" + fileName);
} else {
Log.v("ParseImageString()", "bad imageName=" + fileName);
}
}
Log.v("ParseImageString()", "imagelist.size=" + list.size());
return list;
}
/**
* 判断是否相应的图片格式
*/
private boolean checkIsImageFile(String fName) {
boolean isImageFormat;
if (fName.endsWith(".jpg") || fName.endsWith(".gif") || fName.endsWith(".png") || fName.endsWith(".jpeg") || fName.endsWith(".bmp")) {
isImageFormat = true;
} else {
isImageFormat = false;
}
return isImageFormat;
}
@Override
public boolean onTouch(View view, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
capX = 0;
capY = 0;
width = 0;
height = 0;
capX = (int) event.getX();
capY = (int) event.getY();
break;
case MotionEvent.ACTION_MOVE:
capM = (int) event.getX();
capN = (int) event.getY();
captureView.setSeat(capX, capY, capM, capN);
captureView.postInvalidate();
break;
case MotionEvent.ACTION_UP:
if (event.getX() > capX) {
width = (int) event.getX() - capX;
} else {
width = (int) (capX - event.getX());
capX = (int) event.getX();
}
if (event.getY() > capY) {
height = (int) event.getY() - capY;
} else {
height = (int) (capY - event.getY());
capY = (int) event.getY();
}
captureBitmap = getCapturePreview(this);
if (null != captureBitmap) {
btnPreview.setImageBitmap(captureBitmap);
}
break;
}
if (captureView.isSign()) {
return false;
} else {
return true;
}
}
private Bitmap getCapturePreview(Activity activity) {
View view = activity.getWindow().getDecorView();
view.setDrawingCacheEnabled(true);
view.buildDrawingCache();
Bitmap bitmap = view.getDrawingCache();
Rect frame = new Rect();
activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);
int toHeight = frame.top;
//todo:这里需要针对部分机型做适配
if (width > 0 && height > 0) {
bitmap = Bitmap.createBitmap(bitmap, capX, capY + 240, width, height);
view.setDrawingCacheEnabled(false);
return bitmap;
} else {
return null;
}
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_cancel:
Intent cancelintent = getIntent();
createPendingResult(600, cancelintent, PendingIntent.FLAG_UPDATE_CURRENT);
setResult(RESULT_OK, cancelintent);
finish();
break;
case R.id.btn_capture:
Intent sureintent = getIntent();
createPendingResult(CpAIphotoAttributes.PHOTO_CAPTURE, sureintent, PendingIntent.FLAG_UPDATE_CURRENT);
if (captureBitmap != null) {
try {
String file = IMAGE_PATH;
String randomid = UUID.randomUUID().toString();
String filename = randomid+ ".jpeg";
FileOutputStream fout = new FileOutputStream(file+filename);
captureBitmap.compress(Bitmap.CompressFormat.JPEG, 100, fout);
sureintent.putExtra("capturePath", file+filename);
sureintent.putExtra("capturefilename", filename);
sureintent.putExtra("capturefileid", randomid);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
setResult(RESULT_OK, sureintent);
finish();
break;
default:
break;
}
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_BACK:
Intent cancelintent = getIntent();
createPendingResult(600, cancelintent, PendingIntent.FLAG_UPDATE_CURRENT);
cancelintent.putExtra("imagePath", imagePath);
cancelintent.putExtra("position", position);
cancelintent.putExtra("todowhat", "cancel");
setResult(RESULT_OK, cancelintent);
finish();
break;
default:
break;
}
return false;
}
@Override
public void finish() {
super.finish();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_OK) {
switch (requestCode) {
case 400:
String text = null;
Log.v("DrawRectActivity", "onActivityReault imagePath=" + imagePath + imageList.get(position));
if (StringUtil.isNotBlank(text)) {
Log.v("DrawRectActivity", "onActivityReault imagePath=" + imagePath + imageList.get(position) + ";text=" + text);
} else {
}
break;
default:
break;
}
}
super.onActivityResult(requestCode, resultCode, data);
}
@Override
protected void onDestroy() {
super.onDestroy();
}
}
原文链接:https://blog.csdn.net/yaojie5519/article/details/92850670
相关推荐
- 2022-08-02 Python Pandas处理CSV文件的常用技巧分享_python
- 2023-01-01 c语言之如何求e的近似值_C 语言
- 2022-07-15 Python中列表索引 A[ : 2 ]与A[ : , 2]的区别说明_python
- 2023-04-19 微信小程序授权登录三种实现方式
- 2022-04-03 C++内嵌汇编示例详解_C 语言
- 2022-11-23 GoLang channel底层代码实现详解_Golang
- 2022-09-29 python绘制直方图的方法_python
- 2022-10-14 SpringCloud组件之Feign远程调用
- 最近更新
-
- window11 系统安装 yarn
- 超详细win安装深度学习环境2025年最新版(
- Linux 中运行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存储小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基础操作-- 运算符,流程控制 Flo
- 1. Int 和Integer 的区别,Jav
- spring @retryable不生效的一种
- Spring Security之认证信息的处理
- Spring Security之认证过滤器
- Spring Security概述快速入门
- Spring Security之配置体系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置权
- redisson分布式锁中waittime的设
- maven:解决release错误:Artif
- restTemplate使用总结
- Spring Security之安全异常处理
- MybatisPlus优雅实现加密?
- Spring ioc容器与Bean的生命周期。
- 【探索SpringCloud】服务发现-Nac
- Spring Security之基于HttpR
- Redis 底层数据结构-简单动态字符串(SD
- arthas操作spring被代理目标对象命令
- Spring中的单例模式应用详解
- 聊聊消息队列,发送消息的4种方式
- bootspring第三方资源配置管理
- GIT同步修改后的远程分支