拍照/从相册读取图片后进行裁剪的方法

本范例实现的是用户可以通过拍照、相册获取图片,然后进行裁剪,最后将结果保存在IamgeView中。当然你可以选择将结果同时存放在sd卡中,作为以后的缓存。

思路:

1.通过拍照获取图片

进入系统自带的相机界面——>拍照——>保存在sd卡中——>读取sd卡的文件进行裁减。PS:裁剪前先判断是否获取到图片了

2.通过系统相册获取图片

进入系统相册——>找到图片——>进行裁减。PS:裁剪前线判断是否获取到系统的图片了

接下来贴上实现方法:

1.进入拍照界面或者相册的方法,获取信息后回调onActivityResult()方法

public void buttonListener(View v) {
        switch (v.getId()) {
        case R.id.fromAlbum_button:
            // 来自相册
            Intent albumIntent = new Intent(Intent.ACTION_PICK, null);
            /**
             * 下面这句话,与其它方式写是一样的效果,如果:
             * intent.setData(MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
             * intent.setType(""image/*");设置数据类型
             * 要限制上传到服务器的图片类型时可以直接写如:"image/jpeg 、 image/png等的类型"
             */
            albumIntent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
            startActivityForResult(albumIntent, ALBUM_OK);
            break;
        case R.id.fromCamera_button:
            // 来自相机
            Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            // 下面这句指定调用相机拍照后的照片存储的路径
            cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));
            startActivityForResult(cameraIntent, CAMERA_OK);// CAMERA_OK是用作判断返回结果的标识
            break;

        default:
            break;
        }
    }

2.得到信息,交给onActivityResult()处理。先判断是否得到信息,如果得到就进行裁剪

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        System.out.println("requestCode = " + requestCode);
        switch (requestCode) {
        // 如果是直接从相册获取
        case ALBUM_OK:
            //从相册中获取到图片了,才执行裁剪动作
            if (data != null) {
                clipPhoto(data.getData());
            }
            break;
        // 如果是调用相机拍照时
        case CAMERA_OK:
            // 当拍照到照片时进行裁减,否则不执行操作
            if (file.exists()) {
                clipPhoto(Uri.fromFile(file));//开始裁减图片
            }
            break;
        // 取得裁剪后的图片,这里将其设置到imageview中
        case CUT_OK:
            /**
             * 非空判断大家一定要验证,如果不验证的话, 在剪裁之后如果发现不满意,
             * 要重新裁剪,丢弃 当前功能时,会报NullException
             */
            if (data != null) {
                setPicToView(data);
            }
            break;
        default:
            break;

        }
        super.onActivityResult(requestCode, resultCode, data);
    }

3.进行图片裁剪的方法:

/**
     * 裁剪图片方法实现
     * @param uri
     */
    public void clipPhoto(Uri uri) {
        Intent intent = new Intent("com.android.camera.action.CROP");
        intent.setDataAndType(uri, "image/*");
        // 下面这个crop = true是设置在开启的Intent中设置显示的VIEW可裁剪
        intent.putExtra("crop", "true");
        // aspectX aspectY 是宽高的比例,这里设置的是正方形(长宽比为1:1)
        intent.putExtra("aspectX", 1);
        intent.putExtra("aspectY", 1);
        // outputX outputY 是裁剪图片宽高
        intent.putExtra("outputX", 200);
        intent.putExtra("outputY", 200);
        intent.putExtra("return-data", true);
        startActivityForResult(intent, CUT_OK);
    }

4.将裁剪好的图片设置到ImageView中,同时清楚缓存图片

/**
     * 保存裁剪之后的图片数据 将图片设置到imageview中
     *
     * @param picdata
     */
    private void setPicToView(Intent picdata) {
        Bundle extras = picdata.getExtras();
        if (extras != null) {
            Bitmap photo = extras.getParcelable("data");
            Drawable drawable = new BitmapDrawable(photo);
            showIv.setImageDrawable(drawable);
            file.delete();//设置成功后清除之前的照片文件
        }
    }

最后贴上全部的代码:

package com.kale.picturecut;

import java.io.File;

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

public class MainActivity extends Activity {

    // 拍照成功,读取相册成功,裁减成功
    private final int  ALBUM_OK = 1, CAMERA_OK = 2,CUT_OK = 3;
    private ImageView showIv;
    private File file;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 定义拍照后存放图片的文件位置和名称,使用完毕后可以方便删除
        file = new File(Environment.getExternalStorageDirectory(), "temp.jpg");
        file.delete();// 清空之前的文件

        showIv = (ImageView) findViewById(R.id.show_imageView);
    }

    public void buttonListener(View v) {
        switch (v.getId()) {
        case R.id.fromAlbum_button:
            // 来自相册
            Intent albumIntent = new Intent(Intent.ACTION_PICK, null);
            /**
             * 下面这句话,与其它方式写是一样的效果,如果:
             * intent.setData(MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
             * intent.setType(""image/*");设置数据类型
             * 要限制上传到服务器的图片类型时可以直接写如:"image/jpeg 、 image/png等的类型"
             */
            albumIntent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
            startActivityForResult(albumIntent, ALBUM_OK);
            break;
        case R.id.fromCamera_button:
            // 来自相机
            Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            // 下面这句指定调用相机拍照后的照片存储的路径
            cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));
            startActivityForResult(cameraIntent, CAMERA_OK);// CAMERA_OK是用作判断返回结果的标识
            break;

        default:
            break;
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        System.out.println("requestCode = " + requestCode);
        switch (requestCode) {
        // 如果是直接从相册获取
        case ALBUM_OK:
            //从相册中获取到图片了,才执行裁剪动作
            if (data != null) {
                clipPhoto(data.getData());
            }
            break;
        // 如果是调用相机拍照时
        case CAMERA_OK:
            // 当拍照到照片时进行裁减,否则不执行操作
            if (file.exists()) {
                clipPhoto(Uri.fromFile(file));//开始裁减图片
            }
            break;
        // 取得裁剪后的图片,这里将其设置到imageview中
        case CUT_OK:
            /**
             * 非空判断大家一定要验证,如果不验证的话, 在剪裁之后如果发现不满意,
             * 要重新裁剪,丢弃 当前功能时,会报NullException
             */
            if (data != null) {
                setPicToView(data);
            }
            break;
        default:
            break;

        }
        super.onActivityResult(requestCode, resultCode, data);
    }

    /**
     * 裁剪图片方法实现
     * @param uri
     */
    public void clipPhoto(Uri uri) {
        Intent intent = new Intent("com.android.camera.action.CROP");
        intent.setDataAndType(uri, "image/*");
        // 下面这个crop = true是设置在开启的Intent中设置显示的VIEW可裁剪
        intent.putExtra("crop", "true");
        // aspectX aspectY 是宽高的比例,这里设置的是正方形(长宽比为1:1)
        intent.putExtra("aspectX", 1);
        intent.putExtra("aspectY", 1);
        // outputX outputY 是裁剪图片宽高
        intent.putExtra("outputX", 200);
        intent.putExtra("outputY", 200);
        intent.putExtra("return-data", true);
        startActivityForResult(intent, CUT_OK);
    }

    /**
     * 保存裁剪之后的图片数据 将图片设置到imageview中
     *
     * @param picdata
     */
    private void setPicToView(Intent picdata) {
        Bundle extras = picdata.getExtras();
        if (extras != null) {
            Bitmap photo = extras.getParcelable("data");
            Drawable drawable = new BitmapDrawable(photo);
            showIv.setImageDrawable(drawable);
            file.delete();//设置成功后清除之前的照片文件
        }
    }
}

权限:

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.per

源码下载:

时间: 2024-11-03 03:46:49

拍照/从相册读取图片后进行裁剪的方法的相关文章

Android拍照、相册 获取图片后,裁剪图片

最近在做的B2B的项目,图片大部分来源于用户自己上传: 由于android尺寸的不一,用户相机,相册的图片也是奇形怪状: 所以在上传之前对图片做一次裁剪是很有必要的! 下面是按比例裁剪图片的demo 资源文件activity_main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/

HTML5 Plus 拍照或者相册选择图片上传

利用HTML Plus的Camera.GalleryIO.Storage和Uploader来实现手机APP拍照或者从相册选择图片上传.Camera模块管理设备的摄像头,可用于拍照.摄像操作,通过plus.camera获取摄像头管理对象.Gallery模块管理系统相册,支持从相册中选择图片或视频文件.保存图片或视频文件到相册等功能.通过plus.gallery获取相册管理对象.IO模块管理本地文件系统,用于对文件系统的目录浏览.文件的读取.文件的写入等操作.通过plus.io可获取文件系统管理对象

Android从相册读取图片

Uri originalUri = data.getData();        //获得图片的uri  bm = MediaStore.Images.Media.getBitmap(resolver, originalUri);         //显得到bitmap图片 imgShow.setImageBitmap(bm); http://blog.csdn.net/qq435757399/article/details/8118528 http://blog.csdn.net/dxj007

Android拍照,相册选择图片以及Android6.0权限管理

概述 在android开发过程中,拍照或者从相册中选择图片是很常见的功能.下面要说得这个案例比较简单,用户点击按钮选择拍照或者打开相册选择图片,然后将选中的图片显示在手机上.android6.0后,推出了动态权限管理.以往我们将涉及到的权限全部写在清单文件中,只要用户安装了该程序,程序在运行过程中都会获得相应权限.android6.0后,对于一些特别敏感的权限,开发者必须在程序中进行声明.拍照和从相册选择图片都是涉及到用户隐私的敏感权限,必须在程序中进行声明. 大概的流程 创建布局文件,这里不多

ajax读取图片后排列问题(先加载完图片再排列)

网上找了个瀑布流的图片排列插件.从数据库读取图片路径后显示时出现了位置重叠问题. 1 $.ajax({ 2 type: "POST", 3 url: "index.aspx", 4 data: { 'action': 'SelectImage'}, 5 dataType: "json", 6 success: function (result) { 7 var imgpanel = $("#imgitem"); 8 var i

html5plus 从相册选择图片后获取图片的大小

plus.gallery.pick(function (filePath) { plus.io.resolveLocalFileSystemURL(filePath, function (entry) { console.log('resolveLocalFileSystemURL success') entry.getMetadata(function (metaData) { console.log('getMetadata success') console.log(metaData.si

QRCode 扫描二维码、扫描条形码、相册获取图片后识别、生成带 Logo 二维码、支持微博微信 QQ 二维码扫描样式

参考链接:https://github.com/bingoogolapple/BGAQRCode-Android 原文地址:https://www.cnblogs.com/xindejiyi/p/10440006.html

iOS读取图片数据的两种方法:UIImageJPEG和UIImagePNG

UIImageJPEGRepresentation函数有两个参数:引用的图片和压缩系数. UIImagePNGRepresentation(UIImage * image)函数只有一个引用图片参数. UIImagePNGRepresentation(UIImage * image)要比UIImageJPEGPresentation(UIImage * image, 1.0)返回的图片数据量大很多,如果对图片清晰度要求不高,可以通过设置UIImageJPEGReprentation的第二个参数,大

【学习ios之路:UI系列】点击更换头像实现从相册读取照片和拍照两种功能

功能如下: 1.点击头像,提示选择更换头像方式①相册 ②照相. 2.点击相册,实现通过读取系统相册,获取图片进行替换. 3.点击照相,通过摄像头照相,进行替换照片. 4.如果摄像头,弹出框警告. 代码如下: 1.通过UIActionSheet对象实现提示功能 //创建对象 UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle: @"提示" delegate:self cancelButtonTitle:@&q