Android怎么实现手势划定区域裁剪图片
发表于:2025-11-06 作者:千家信息网编辑
千家信息网最后更新 2025年11月06日,这篇文章主要介绍"Android怎么实现手势划定区域裁剪图片"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"Android怎么实现手势划定区域裁剪图片"文章能帮
千家信息网最后更新 2025年11月06日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安全错误
数据库的锁怎样保障安全
石嘴山市财政网络安全预算
正规的模具制造管理软件开发
电子表格制作数据库
服务器内网设置
用数据库语言建表在哪里
小学生防网络安全知识
伯明翰大学邮箱服务器
有什么好的嵌入式软件开发
安全卫士服务器版
仙桃软件开发电话
江苏行业网络安全管理办法
搞软件开发的群名
宁夏新潮网络安全攻防
小型企业网络安全设计论文
xp没有启动服务器服务
数据库系统对信息技术的作用
软件开发企业成本有哪些
政府单位网络安全自检报告
吉林企业进销存软件开发
日本软件开发人员飞机遇难
矿机挖矿中转服务器
帮信危害网络安全
服务器数据库迁移
甘肃人社服务器设置
电脑如何炒股软件开发
借贷软件开发商
新型的网络技术
服务器无硬盘怎么运行
数据库用SSD的优劣
哪里着网络技术兼职靠谱