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

作者:shuang_bing 时间:2022-01-31 10:35:22 

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


<Button
 android:id="@+id/selectimagebtn"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:text="选择图片" />
<Button
 android:id="@+id/cutimagebtn"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:text="选择图片进行裁剪" />
<!-- 用于显示图片的信息 -->
<ImageView
 android:id="@+id/imageview"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content" />

在Activity上写代码


public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button selectImageBtn, cutImageBtn;
private ImageView imageView;
// 声明两个静态的整型变量,主要用于意图的返回的标志
private static final int IMAGE_SELECT = 1;// 选择图片
private static final int IMAGE_CUT = 2;// 裁剪图片
 @Override
protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 selectImageBtn = (Button) findViewById(R.id.selectimagebtn);
 cutImageBtn = (Button) findViewById(R.id.cutimagebtn);
 imageView = (ImageView) findViewById(R.id.imageview);
 // 注册监听事件
 selectImageBtn.setOnClickListener(this);
 cutImageBtn.setOnClickListener(this);
 }

实现OnClickListener的方法,和设置裁剪图片的方法


@Override
public void onClick(View v) {
 switch (v.getId()) {
  case R.id.selectimagebtn:
   //如何提取手机的图片库,并且进行选择图片的功能
   Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);//打开手机的图片库
   startActivityForResult(intent, IMAGE_SELECT);
   break;
  case R.id.cutimagebtn:
   Intent intent2 = getImageClipIntent();
   startActivityForResult(intent2, IMAGE_CUT);
 }
}
private Intent getImageClipIntent() {
 Intent intent = new Intent(Intent.ACTION_GET_CONTENT, null);//不指定URL
 //实现对图片的裁剪,必须要设置图片的属性和大小
 intent.setType("image/*");//获取任意的图片类型 Set an explicit MIME data type.每个MIME类型由两部分组成,前面是数据的大类别,例如声音audio、图象image等,后面定义具体的种类。
 intent.putExtra("crop", "true");//滑动选中图片区域
 intent.putExtra("aspectX", 1);//表示剪切框的比例1:1的效果
 intent.putExtra("aspectY", 1);
 intent.putExtra("outputX", 80);//指定输出图片的大小
 intent.putExtra("outputY", 80);
 intent.putExtra("return-data", true);//有返回值
 return intent;
}

如果你想在Activity中得到新打开Activity关闭后返回的数据,你需要使用系统提供的startActivityForResult(Intent intent,int requestCode)方法打开新的Activity,新的Activity关闭后会向前面的Activity传回数据,为了得到传回的数据,你必须在前面的Activity中重写onActivityResult(int requestCode, int resultCode,Intent data)方法

当新Activity关闭后,新Activity返回的数据通过Intent进行传递,Android平台会调用前面Activity的onActivityResult()方法,把存放了返回数据的Intent作为第三个输入参数传入,在onActivityResult()方法中使用第三个输入参数可以取出新Activity返回的数据。

需要返回数据或结果的,则使用startActivityForResult (Intent intent, intrequestCode),requestCode的值是自定义的,用于识别跳转的目标Activity。

覆盖onActivityResult方法


@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
 super.onActivityResult(requestCode, resultCode, data);
 if (resultCode == RESULT_OK) {
  //处理图片按照手机的屏幕大小显示
  if (requestCode == IMAGE_SELECT) {
   Uri uri = data.getData();//获得图片的路径
   Display display = getWindowManager().getDefaultDisplay();
   Point point = new Point();
   display.getSize(point);
   int width = point.x;//获得屏幕的宽度
   int height = point.y ;//屏幕高度
   try {
    //实现对图片的裁剪的类,是一个匿名内部类
    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = false;
    //对图片的宽度和高度对应手机的屏幕进行匹配
    Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri), null, options);
    //如果大于1表示图片的高度大于手机屏幕的高度
    int hRatio = (int) Math.ceil(options.outHeight / (float) height);//(int)Math.ceil是下取整
    //如果大于1表示图片的宽度大于手机屏幕的宽度
    int wRatio = (int) Math.ceil(options.outWidth / (float) width);
    //如果hRatio或wRatio大于1,则把图片缩放到1/radio的尺寸和1/radio^2的像素
    if (hRatio > 1 || wRatio > 1) {
     if (hRatio > wRatio) {
      options.inSampleSize = hRatio;
     } else {
      options.inSampleSize = wRatio;
     }
     bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri), null, options);
     imageView.setImageBitmap(bitmap);
    }else{
     //如果hRatio与wRatio为0,直接输出
     imageView.setImageBitmap(bitmap);
    }
   } catch (Exception e) {
   }
   //表示裁剪图片
  } else if (requestCode == IMAGE_CUT) {
   Bitmap bitmap = data.getParcelableExtra("data");
   imageView.setImageBitmap(bitmap);
  }
 }
}

options.inJustDecodeBounds = false/true;

我们去解析一个图片,如果太大,就会OOM,我们可以设置压缩比例inSampleSize,但是这个压缩比例设置多少就是个问题,所以我们解析图片可以分为俩个步骤,第一步就是获取图片的宽高,这里要设置Options.inJustDecodeBounds=true,这时候decode的bitmap为null,只是把图片的宽高放在Options里。

然后第二步就是设置合适的压缩比例inSampleSize,inSampleSize为原来的1/ratio,这时候获得合适的Bitmap。

再设置options.inJustDecodeBounds = false;重新读出图片bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri), null, options);

以上所述是小编给大家介绍的Android ImageView实现图片裁剪和显示功能网站的支持!

来源:http://blog.csdn.net/shuang_bing/article/details/56845165

标签:android,imageview,图片
0
投稿

猜你喜欢

  • VS2019配置OpenCV时找不到Microsoft.Cpp.x64.user的解决方法

    2023-07-01 01:57:36
  • Android中实现下载URL地址的网络资源的实例分享

    2023-07-30 03:56:58
  • 深入探究如何使用Java编写MapReduce程序

    2022-10-17 18:40:04
  • Springboot中登录后关于cookie和session拦截问题的案例分析

    2022-09-25 19:26:44
  • 基于C#实现屏幕取色器的示例详解

    2021-06-26 08:58:05
  • Java实战之王者荣耀的英雄是怎么产生的?

    2021-08-25 12:35:49
  • 图文精讲java常见分布式事务理论与解决方案

    2023-05-22 19:50:10
  • Java实现计算器设计

    2023-08-18 13:36:54
  • Java 中HashCode作用_动力节点Java学院整理

    2021-12-08 12:26:55
  • C# 使用multipart form-data方式post数据到服务器

    2023-12-20 21:10:58
  • servlet异步请求的实现

    2023-07-14 17:11:38
  • Spring Cloud Alibaba 本地调试介绍及方案设计

    2023-05-26 21:24:26
  • 如何用.NETCore操作RabbitMQ

    2022-06-20 04:11:04
  • Android项目中引入aar包的正确方法介绍

    2021-09-01 20:10:16
  • 下载软件后使用c#获取文件的md5码示例

    2022-02-08 21:39:58
  • mac系统下载、安装、使用AndroidStudio

    2021-06-04 03:28:40
  • Java中对象的销毁方法分析

    2023-01-09 16:44:29
  • Springboot 跨域配置无效及接口访问报错的解决方法

    2021-10-02 01:04:11
  • Java中为什么start方法不能重复调用而run方法可以?

    2023-11-15 03:04:02
  • Java文件与IO流操作原理详细分析

    2023-08-12 13:13:46
  • asp之家 软件编程 m.aspxhome.com