Android怎么实现手势划定区域裁剪图片
发表于:2025-01-16 作者:千家信息网编辑
千家信息网最后更新 2025年01月16日,这篇文章主要介绍"Android怎么实现手势划定区域裁剪图片"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"Android怎么实现手势划定区域裁剪图片"文章能帮
千家信息网最后更新 2025年01月16日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 ArrayListimageList = 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安全错误
数据库的锁怎样保障安全
visio 刀片服务器
动森服务器怎么连
杭州恩牛网络技术有限待遇
贵州省网络安全市场有多大
互联网科技相关的法律法规
网络安全法主题宣传片
公安部关于网络安全的法规
数据库报错01480
华为服务器延保
江苏科源网络技术有限公司
网络安全宣传周活动总结高中
周村污染源信息数据库
db2数据库如何断开连接
服务器跨
吉林综合软件开发销售厂家
思科 dhcp服务器
聚云位智以决策型数据库安全吗
集团公司实行网络安全通报制度
主要的数据库安全性方法
网络安全环保内容
安装程序数据库已损坏
苏州计算机软件开发定制费用
桂林计算机网络技术大学
数据库判断是否相等
企业级软件开发的体系结构
网络安全信息泄露问题
网络安全出问题
vpn服务器搭建 php
手机下载同名数据库
dnf手游服务器跨区规定