在Android中实现图片的裁剪

   

本实例的功能是将用户选择的图片裁剪后放入ImagView,布局文件是个Button和ImageView。为了图片的正常显示,我们在裁剪后先将裁剪好的图片先存放到SD卡中,这样就能在以后开启应用的时候直接调用了。

main_activity.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="${relativePackage}.${activityClass}" >

    <Button
        android:id="@+id/image_tailer_button_id"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:text="裁剪图片" />

    <ImageView
        android:id="@+id/user_imageView_id"
        android:layout_width="300dp"
        android:layout_height="300dp"
        android:layout_above="@+id/image_tailer_button_id"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="100dp"
        android:src="@drawable/ic_launcher" />

</RelativeLayout>

MainActivity.java

package com.kale.imagetailor;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;

public class MainActivity extends Activity {
    
    private String tag = getClass().getSimpleName();
    private static Uri imageUri;
    
    Button imageTailorBt;
    ImageView userIV;
    File file;
    FileManager fm;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        viewInit();
        fm = new FileManager();
        try {
            file = fm.creatSDFile("Kale Image", "userImage.jpg");
        } catch (IOException e) {
            // TODO 自动生成的 catch 块
            e.printStackTrace();
        }
    }
    
    /**
     *每次开启时判断设置什么图片,如果有自定义的图片了,那么就用用户自己的头像 
     */
    private void setUserImage(){
        userIV.setImageResource(R.drawable.ic_launcher);  
        //从sd卡中得到图片资源
        String filepath = fm.getFileWholePath();
        Bitmap bm = BitmapFactory.decodeFile(filepath);

        if(bm != null){
            //BtimapDrawable是Drawable的子类,最终直接使用bd对象即可。
            userIV.setImageDrawable(new BitmapDrawable(bm));
        }
        else{
            userIV.setImageResource(R.drawable.ic_launcher); 
        }
    }
    
    private void viewInit(){
        userIV = (ImageView)findViewById(R.id.user_imageView_id);
        imageTailorBt = (Button)findViewById(R.id.image_tailer_button_id);
        imageTailorBt.setOnClickListener(new OnClickListener() {
            
            @Override
            public void onClick(View arg0) {
                // TODO 自动生成的方法存根
                changeUserImage();
            }
        });
    }
    
    
    /**
     *改变用户头像的方法,这里设定一个intent交给activity去处理
     */
    protected void changeUserImage(){
        Toast.makeText(getApplicationContext(), "更换头像", 0).show();
        imageUri = Uri.parse("file:///sdcard/temp.jpg"); 
        
        Intent intent = null;
        intent = new Intent(Intent.ACTION_GET_CONTENT, null);
        intent.setType("image/*");// 设置属性,表示获取任意类型的图片
        intent.putExtra("crop", "true");// 设置可以滑动选选择区域的属性,注意这里是字符串"true" 
        intent.putExtra("aspectX", 1);// 设置剪切框1:1比例的效果  
        intent.putExtra("aspectY", 1);// 设置剪切框1:1比例的效果  
        intent.putExtra("outputX", 600);
        intent.putExtra("outputY", 600);
        intent.putExtra("scale", true);
        intent.putExtra("return-data", false);
        intent.putExtra(MediaStore.EXTRA_OUTPUT,imageUri);
        intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
        intent.putExtra("noFaceDetection", false); // no face detection
        startActivityForResult(intent, 1);
    }
    
    /**
     * @param uri
     * @return 一个bitmap对象,用来设置图片
     */
    private Bitmap decodeUriAsBitmap(Uri uri){
        Bitmap bitmap = null;
        try {
            bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            return null;
        }
        return bitmap;
    }
    
    /**
     * 用来设置图片,并保持的本地
     */
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        //不正确的情况下
        if(resultCode != Activity.RESULT_OK){
            Log.e(tag, "requestCode = " + requestCode);
            Log.e(tag, "resultCode = " + resultCode);
            Log.e(tag, "data = " + data);
            return;
        }
        else{
            Log.d(tag, "CHOOSE_A_BIG_PICTURE: data = " + data);
            if(imageUri != null){
                Bitmap photo = decodeUriAsBitmap(imageUri);
                try {
                    //保存到本地文件
                    File pictureFile = file;
                    FileOutputStream fos = new FileOutputStream(pictureFile);
                    photo.compress(Bitmap.CompressFormat.JPEG, 100, fos);
                    fos.close();
                    Toast.makeText(this, "设置成功~", 0).show();
                   
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                    Toast.makeText(this, "保存路径不存在", 0).show();
                } catch (IOException e) {
                    e.printStackTrace();
                    Toast.makeText(this, "设置图片失败", 0).show();
                }
            }
        }
        setUserImage();
    }
}

里面用到的将图片存放到SD卡中的类

FileManager.java

package com.kale.imagetailor;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import android.os.Environment;

/**
 * @tips  :
 *  <!-- 读写SD卡的权限 -->
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
 * @date  :2014-6-30
 */
public class FileManager {
    private String SD_PATH;
    private String fileName;
    private String dirName;

    public String getSD_PATH() {
        return SD_PATH;
    }
    public FileManager() {
        //得到当前外部存储设备的目录
        SD_PATH = Environment.getExternalStorageDirectory() + "/";
    }
    /**
     * 在SD卡上创建文件
     * 
     * @throws IOException
     */
    public File creatSDFile(String dirName ,String fileName) throws IOException {
        this.fileName = fileName;
        this.dirName = dirName;
        File file = new File(creatSDDir(dirName), fileName);
        return file;
    }
    
    
    public String getFileWholePath(){
        return SD_PATH + dirName + "/" + fileName;
    }
    
    /**
     * 在SD卡上创建目录
     * 
     * @param dirName
     */
    public File creatSDDir(String dirName) {
        File dir = new File(SD_PATH + dirName);
        dir.mkdir();
        return dir;
    }
    


    /**
     * 判断SD卡上的文件夹是否存在
     */
    public boolean isFileExist(String fileName ,String dirName){
        File file = new File(SD_PATH +dirName+"/"+ fileName);
        return file.exists();
    }
    
    /**
     * 将一个InputStream里面的数据写入到SD卡中
     */
    public File saveToSdCard(String dirName,String fileName,InputStream input){
        File file = null;
        OutputStream output = null;
        try{
            //创建目录
            creatSDDir(dirName);
            //建立文件
            file = creatSDFile(dirName ,fileName);
            output = new FileOutputStream(file);
            byte buffer [] = new byte[5 * 1024];
            int count = 0;
            while((count = input.read(buffer)) != -1){
                String str = new String(buffer,0,count);
                //str = new String(str.getBytes("iso-8859-1"),"utf-8");                
                System.out.println("---------File Manager----start--------");
                System.out.println(str);
                System.out.println("---------File Manager-----end-------");
                output.write(buffer);
            }
            output.flush();
        }
        catch(Exception e){
            e.printStackTrace();
        }
        finally{
            try{
                output.close();
            }
            catch(Exception e){
                e.printStackTrace();
            }
        }
        return file;
    }

}

源码下载:http://download.csdn.net/detail/shark0017/7623057

原文地址:https://www.cnblogs.com/tianzhijiexian/p/3859480.html