zoukankan      html  css  js  c++  java
  • 在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

  • 相关阅读:
    c语言中while((c=getchar())!=EOF)怎样才能输入EOF是循环中断
    Python学习笔记之装饰器原理
    Ubuntu中使用pip3报错
    Django配置xadmin后台模板之坑(一)
    ES6之字符串扩展
    Koa中设置中文Cookie值
    node中中间件body-parser的实现方式
    CSS笔记之Grid网格系统
    从0开始搭建vue+webpack脚手架(四)
    从0开始搭建vue+webpack脚手架(三)
  • 原文地址:https://www.cnblogs.com/tianzhijiexian/p/3859480.html
Copyright © 2011-2022 走看看