Android实现手势划定区域裁剪图片
脚本之家 / 编程助手:解决程序员“几乎”所有问题!
脚本之家官方知识库 → 点击立即使用
本文实例为大家分享了Android实现手势划定区域裁剪图片的具体代码,供大家参考,具体内容如下
需求:
拍照,然后对图片进行处理,划定矩形区域,将矩形区域裁剪下来
思路:
1、使用系统相机拍照,拍完返回,对图片进行压缩和存储。
2、新建一个activity处理图片裁剪,利用自定义view在画布上画出矩形区域。
3、根据坐标信息生成裁剪图片并存储。
部分核心代码:
1、调用系统相机拍照
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | 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、裁剪页面布局
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | <? 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 | 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(); } } |
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
微信公众号搜索 “ 脚本之家 ” ,选择关注
程序猿的那些事、送书等活动等着你
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 reterry123@163.com 进行投诉反馈,一经查实,立即处理!
相关文章
Android点击EditText文本框之外任何地方隐藏键盘的解决办法
这篇文章主要介绍了Android点击EditText文本框之外任何地方隐藏键盘的解决办法,非常不错,具有参考借鉴价值,需要的朋友可以参考下2017-01-01Android可循环显示图像的Android Gallery组件用法实例
这篇文章主要介绍了Android可循环显示图像的Android Gallery组件用法,结合实例形式分析了Gallery组件的功能,使用方法及相关注意事项,需要的朋友可以参考下2016-04-04Android利用RenderScript实现毛玻璃模糊效果示例
毛玻璃效果(亦称磨砂效果),近两年在移动端的UI设计上越来越流行,下面这篇文章主要介绍了Android利用RenderScript实现毛玻璃模糊效果的相关资料,文中给出了详细的示例代码,需要的朋友可以参考学习,下面来一起看看吧。2017-03-03Android Studio 导入开源项目的正确姿势及注意事项
这篇文章主要介绍了Android Studio 导入开源项目的正确姿势及注意事项,需要的朋友参考下吧2018-03-03
最新评论