Android图片操作(拍照,相册选图及裁剪)

—-主界面类:拍照及选择相册图片——

import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;

/**
 * Android中图片操作(拍照,相册图片选择及图片裁剪)
 * 作者:ldm
 * 时间:20162016/7/11 09:09
 */
public class ImageTestActivity extends Activity implements View.OnClickListener {
    //拍照
    private Button take_photo;
    //从相册中选择图片
    private Button local_pic;
    //图片展示
    private ImageView upload_image;
    //定义操作常量
    private final static int TAKE_PHOTO_REQUEST = 1;
    private final static int LOCAL_PICS_REQUEST = 2;
    private final static int UPLOAD_PIC_REQUEST = 3;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_image_test);
        //初始化控件及监听事件
        initViews();
    }

    private void initViews() {
        this.upload_image = (ImageView) findViewById(R.id.upload_image);
        this.take_photo = (Button) findViewById(R.id.take_photo);
        this.local_pic = (Button) findViewById(R.id.local_pics);
        this.take_photo.setOnClickListener(this);
        this.local_pic.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        if (view.getId() == R.id.take_photo) {//拍照
            //调用系统拍照In
            Intent photoIn = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            startActivityForResult(photoIn, TAKE_PHOTO_REQUEST);
        } else if (view.getId() == R.id.local_pics) {//从相册选择
            Intent picsIn = new Intent(Intent.ACTION_GET_CONTENT);
            picsIn.setType("image/*");//设置选择的数据类型为图片类型
            startActivityForResult(picsIn, LOCAL_PICS_REQUEST);
        }
    }

    //拍照或选择相册后,数据在这里处理
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (null == data) {
            return;
        }
        switch (requestCode) {
            case TAKE_PHOTO_REQUEST:
                Bundle bundle = data.getExtras();//获取到图片数据
                if (null != bundle) {
                    Bitmap bm = bundle.getParcelable("data");
                    //把图片展示在ImView上
//                    upload_image.setImageBitmap(bm);
                    //对图片剪
                    Uri uri = ImageUtils.saveBitmapToSdCard(bm);
                    startImageCrop(uri);
                }
                break;
            case LOCAL_PICS_REQUEST:
                Uri uri = data.getData();//从图片的Uri是以cotent://格式开头的
                //获取到图片
                Bitmap bm = ImageUtils.uri2Bitmap(ImageTestActivity.this, uri);
                //把图片展示在ImView上
//                upload_image.setImageBitmap(bm);
                //把拍照的图片保存到本地并转换成文件格式的Uri
                Uri fileUri = ImageUtils.saveBitmapToSdCard(bm);
                //对图片剪
                startImageCrop(fileUri);
                break;
            case UPLOAD_PIC_REQUEST:
                //把裁剪后的图片展示出来
                Bundle b = data.getExtras();
                Bitmap bitmap = b.getParcelable("data");
                //图片展示出来
                upload_image.setImageBitmap(bitmap);
                break;
        }
    }

    /**
     * @param
     * @description 图片裁剪
     * @author ldm
     * @time 2016/7/11 10:07
     */
    private void startImageCrop(Uri uri) {
        Intent intent = new Intent("com.android.camera.action.CROP");
        intent.setDataAndType(uri, "image/*");//设置Uri及类型
        intent.putExtra("crop", "true");//
        intent.putExtra("aspectX", 2);//X方向上的比例
        intent.putExtra("aspectY", 1);//Y方向上的比例
        intent.putExtra("outputX", 200);//裁剪区的X方向宽
        intent.putExtra("outputY", 100);//裁剪区的Y方向宽
        intent.putExtra("scale", true);//是否保留比例
        intent.putExtra("outputFormat", Bitmap.CompressFormat.PNG.toString());
        intent.putExtra("return-data", true);//是否将数据保留在Bitmap中返回dataParcelable相应的Bitmap数据
        startActivityForResult(intent, UPLOAD_PIC_REQUEST);

    }
}

—-布局文件——

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Button
        android:id="@+id/take_photo"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="10dp"
        android:text="拍照上传" />

    <Button
        android:id="@+id/local_pics"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="10dp"
        android:text="本地图库上传" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="图片信息展示"
        android:layout_marginLeft="10dp"
        android:textSize="16sp"/>

    <ImageView
        android:id="@+id/upload_image"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"/>
</LinearLayout>

—-图片操作工具类——

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.text.format.DateFormat;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.Calendar;
import java.util.Locale;

/**
 * description:从图片中获取到的Uri是以content://开头的,从U中找到对应图片
 * 作者:ldm
 * 间:20162016/7/11 09:47
 */
public class ImageUtils {
    public static Bitmap uri2Bitmap(Context mContext, Uri uri) {
        InputStream in = null;
        try {
            in = mContext.getContentResolver().openInputStream(uri);
            //从输入流中获取到图片
            Bitmap bm = BitmapFactory.decodeStream(in);
            in.close();
            return bm;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }


    /**
     * @param
     * @description 保存图片到手机SD卡, 并返回图片对应的文件i
     * @author ldm
     * @time 2016/7/11 9:55
     */
    public static Uri saveBitmapToSdCard(Bitmap bm) {
        //自定义图片名称
        String name = DateFormat.format("yyyyMMdd_hhmmss", Calendar.getInstance(Locale.CHINA)) + ".png";
        //定义图片存放的位置
        File tempFile = new File("/sdcard/Image/");
        if (!tempFile.exists()) {
            tempFile.mkdir();
        }
        String fileName = "/sdcard/Image/" + name;
        File pic = new File(fileName);
        try {
            FileOutputStream os = new FileOutputStream(pic);
            //对图片进行压缩
            bm.compress(Bitmap.CompressFormat.PNG, 100, os);
            os.flush();
            os.close();
            return Uri.fromFile(pic);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

最后不要忘记在AndroidManifest.xml中添加 相应权限:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
  • 4
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值