时间:2022-06-05 11:18:12 | 栏目: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、裁剪页面布局
<?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(); } }