我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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();
    }
 
}

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

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

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

这篇文章主要介绍“Android怎么实现手势划定区域裁剪图片”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Android怎么实现手势划定区域裁剪图片”文章能帮助大家解决问题。需求:拍照,然后对图片进
2023-06-30

Android自定义View实现照片裁剪框与照片裁剪功能

本文所需要实现的就是这样一种有逼格的效果:右上角加了个图片框,按下确定可以裁剪正方形区域里的图片并显示在右上角。 实现思路: 1:首先需要自定义一个ZoomImageView来显示我们需要的图片,这个View需要让图片能够以合适的位置展现在
2022-06-06

Android图片裁剪功能实现代码

在Android应用中,图片裁剪也是一个经常用到的功能。Android系统中可以用隐式意图调用系统应用进行裁剪,但是这样做在不同的手机可能表现出不同的效果,甚至在某些奇葩手机上还会出其他更奇怪的问题,所以调用系统功能进行图片裁剪在很多时候对
2022-06-06

Android如何实现拍照及图片裁剪

这篇文章主要介绍Android如何实现拍照及图片裁剪,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!最近做项目中涉及到了图片相关功能 ,在使用安卓6.0手机及7.1手机拍照时,遇到了因权限及文件管理导致程序崩溃等问题。
2023-05-30

Android实现拍照、选择图片并裁剪图片功能

一、 实现拍照、选择图片并裁剪图片效果 按照之前博客的风格,首先看下实现效果。 二、 uCrop项目应用 想起之前看到的Yalantis/uCrop效果比较绚,但是研究源码之后发现在定制界面方面还是有一点的限制,于是在它的基础上做了修
2022-06-06

Android ImageView实现图片裁剪和显示功能

首先在layout布局中设置按钮和一个ImageView
2022-06-06

android编程实现系统图片剪裁的方法

本文实例讲述了android编程实现系统图片剪裁的方法。分享给大家供大家参考,具体如下:package cn.test; import java.io.File; import java.text.SimpleDateFormat; imp
2022-06-06

Android编程实现图片拍照剪裁的方法

本文实例讲述了Android实现图片拍照剪裁的方法。分享给大家供大家参考,具体如下: 调用系统的裁剪工具对相册或者拍照的图片进行裁剪。 startActivityforResult用的很恰当,一些系统action需要注意。package c
2022-06-06

Android裁剪图片为圆形图片的实现原理与代码

以前在eoe论坛中找过裁剪图片为圆形图片的方法,但是效果都不是很理想,这几天因为公司业务的要求,需要对头像进行裁剪以圆形的方式显示,这个方法是根据传入的图片的高度(height)和宽度(width)决定的,如果是 width <= heig
2022-06-06

Android实现相机拍摄、选择、图片裁剪功能

最近的一些学习心得: 功能实现:点击圆形头像之后可以实现相册上传或者开启相机,然后把得到的图片经过剪裁,把剪裁过的图片设置为头像的背景图 步骤:第一步:自定义一个类,继承ImageView,重写draw方法,实现外观为圆形 第二步:在xml
2022-06-06

使用Java代码在Android中实现图片裁剪功能

前言 Android应用中经常会遇到上传相册图片的需求,这里记录一下如何进行相册图片的选取和裁剪。 相册选取图片 1. 激活相册或是文件管理器,来获取相片,代码如下:private static final int TAKE_PICTURE
2022-06-06

Android实现读取相机(相册)图片并进行剪裁

我们先说一下思路,在android系统中就自带了图片剪切的应用,所以,我们只需要将我们获取到的相片传给图片剪切应用,再将剪切好的相片返回到我们自己的界面显示就ok了 在开发一些APP的过程中,我们可能涉及到头像的处理,比如从手机或者相册获取
2022-06-06

Android实现拍照、选择相册图片并裁剪功能

通过拍照或相册中获取图片,并进行裁剪操作,然后把图片显示到ImageView上。 当然也可以上传到服务器(项目中绝大部分情况是上传到服务器),参考网上资料及结合项目实际情况, 测试了多款手机暂时没有发现严重问题。代码有注释,直接贴代码:
2022-06-06

Android编程实现调用系统图库与裁剪图片功能

本文实例讲述了Android编程实现调用系统图库与裁剪图片功能。分享给大家供大家参考,具体如下: 在Android开发中,调用系统图库和裁剪照片是很常见的需求。相对于自己实现这种功能,直接调用系统具有诸多优点,如不用考虑屏幕适配,不用担心性
2022-06-06

如何使用Python实现图片自定义裁剪小工具

这篇文章主要介绍了如何使用Python实现图片自定义裁剪小工具,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。环境依赖ffmpy安装:pip install ffmpy -i
2023-06-28

android完美实现 拍照 选择图片 剪裁等代码分享

前言,版本兼容问题主要是由于4.4以前和4.4以后的Uri的格式不同所造成的错误 1.拍照 和选择图片 ①选择图片intent = new Intent(Intent.ACTION_GET_CONTENT);intent.setTyp
2022-06-06

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录