Android怎么实现手势划定区域裁剪图片
发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,这篇文章主要介绍"Android怎么实现手势划定区域裁剪图片"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"Android怎么实现手势划定区域裁剪图片"文章能帮
千家信息网最后更新 2026年10月31日Android怎么实现手势划定区域裁剪图片
这篇文章主要介绍"Android怎么实现手势划定区域裁剪图片"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"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、裁剪页面布局
4、裁剪activity
public class DrawRectActivity extends BasicActivity implements OnClickListener, View.OnTouchListener { private String TAG = "DrawRectActivity"; private String imageString; private String imagePath; private ArrayList 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 parseImageString(String imagePath, String imageString) { ArrayList list = new ArrayList(); 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(); } } 关于"Android怎么实现手势划定区域裁剪图片"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注行业资讯频道,小编每天都会为大家更新不同的知识点。
图片
区域
绘画
手势
矩形
相机
知识
系统
横坐标
纵坐标
行业
部分
处理
存储
不同
实用
代码
信息
内容
坐标
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
西安纸贵互联网科技有限公司
中国互联网科技股
互联网核心科技是什么
互联网科技有限公司图片
科技制造互联网公司
互联网公司 科技公司
互联网科技的发展
为想互联网科技
互联网科技公司官网
智慧科技互联网
成都仁贤领冠互联网科技有限公司
随着互联网科技发展
晓花互联网科技有限公司网址
速维有品互联网信息科技(苏州)有限公司
互联网科技的全部知识
互联网金融科技元年
怎样加入科技互联网
南通创西澳互联网科技有限公司
三亚科技创新互联网基地
互联网科技创新方面的资料
科技股互联网
互联网科技媒体
浩特互联网科技
远拓互联网科技
广州互联网络科技有限公司
乌鲁木齐新华智原互联网科技学校
合肥互联网科技公司公章图片
2021世界互联网领先科技成果发布
互联网金融运营模式中的金融科技
承德科技产业互联网平台