Android实现手势划定区域裁剪图片

 更新时间:2022年05月18日 11:37:59   作者:KWMax  
这篇文章主要为大家详细介绍了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();
    }
  
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

蓄力AI

微信公众号搜索 “ 脚本之家 ” ,选择关注

程序猿的那些事、送书等活动等着你

原文链接:https://blog.csdn.net/yaojie5519/article/details/92850670

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 reterry123@163.com 进行投诉反馈,一经查实,立即处理!

相关文章

最新评论