Android之照相、相冊裁剪功能的實現過程

jopen 10年前發布 | 46K 次閱讀 Android Android開發 移動開發

首先是XML:

 
<ImageButton
android:id="@+id/imageButton1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/xiaoma" />

<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:text="獲取圖片" />

<ImageView
android:id="@+id/imageView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/imageButton1"
android:background="@drawable/xiaoma"/></pre></div>

 

然后貼一下主activity:

</div>

/**

  • @Title: PicCutDemoActivity.java
  • @Package com.xiaoma.piccut.demo
  • @Description: 圖片裁剪功能測試
  • @author XiaoMa
    */
    public class PicCutDemoActivity extends Activity implements OnClickListener {

    private ImageButton ib = null;
    private ImageView iv = null;
    private Button btn = null;
    private String tp = null;

/** Called when the activity is first created. */  
@Override  
public void onCreate(Bundle savedInstanceState) {  
    super.onCreate(savedInstanceState);  
    setContentView(R.layout.main);  
    //初始化  
    init();  
}  

/**  
 * 初始化方法實現  
 */  
private void init() {  
    ib = (ImageButton) findViewById(R.id.imageButton1);  
    iv = (ImageView) findViewById(R.id.imageView1);  
    btn = (Button) findViewById(R.id.button1);  
    ib.setOnClickListener(this);  
    iv.setOnClickListener(this);  
    btn.setOnClickListener(this);  
}  


/**  
 * 控件點擊事件實現  
 *   
 * 因為有朋友問不同控件的背景圖裁剪怎么實現,  
 * 我就在這個地方用了三個控件,只為了自己記錄學習  
 * 大家覺得沒用的可以跳過啦  
 */  
@Override  
public void onClick(View v) {  
    switch (v.getId()) {  
    case R.id.imageButton1:  
        ShowPickDialog();  
        break;  
    case R.id.imageView1:  
        ShowPickDialog();  
        break;  
    case R.id.button1:  
        ShowPickDialog();  
        break;  

    default:  
        break;  
    }  
}  

/**  
 * 選擇提示對話框  
 */  
private void ShowPickDialog() {  
    new AlertDialog.Builder(this)  
            .setTitle("設置頭像...")  
            .setNegativeButton("相冊", new DialogInterface.OnClickListener() {  
                public void onClick(DialogInterface dialog, int which) {  
                    dialog.dismiss();  
                    /**  
                     * 剛開始,我自己也不知道ACTION_PICK是干嘛的,后來直接看Intent源碼,  
                     * 可以發現里面很多東西,Intent是個很強大的東西,大家一定仔細閱讀下  
                     */  
                    Intent intent = new Intent(Intent.ACTION_PICK, null);  

                    /**  
                     * 下面這句話,與其它方式寫是一樣的效果,如果:  
                     * intent.setData(MediaStore.Images.Media.EXTERNAL_CONTENT_URI);  
                     * intent.setType(""image/*");設置數據類型  
                     * 如果朋友們要限制上傳到服務器的圖片類型時可以直接寫如:"image/jpeg 、 image/png等的類型"  
                     *  
                     */  
                    intent.setDataAndType(  
                            MediaStore.Images.Media.EXTERNAL_CONTENT_URI,  
                            "image/*");  
                    startActivityForResult(intent, 1);  

                }  
            })  
            .setPositiveButton("拍照", new DialogInterface.OnClickListener() {  
                public void onClick(DialogInterface dialog, int whichButton) {  
                    dialog.dismiss();  
                    /**  
                     * 下面這句還是老樣子,調用快速拍照功能,至于為什么叫快速拍照,大家可以參考如下官方  
                     * 文檔,you_sdk_path/docs/guide/topics/media/camera.html  
                     *   
                     */  
                    Intent intent = new Intent(  
                            MediaStore.ACTION_IMAGE_CAPTURE);  
                    //下面這句指定調用相機拍照后的照片存儲的路徑  
                    intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri  
                            .fromFile(new File(Environment  
                                    .getExternalStorageDirectory(),  
                                    "xiaoma.jpg")));  
                    startActivityForResult(intent, 2);  
                }  
            }).show();  
}  

@Override  
protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
    switch (requestCode) {  
    // 如果是直接從相冊獲取  
    case 1:  
        startPhotoZoom(data.getData());  
        break;  
    // 如果是調用相機拍照時  
    case 2:  
        File temp = new File(Environment.getExternalStorageDirectory()  
                + "/xiaoma.jpg");  
        startPhotoZoom(Uri.fromFile(temp));  
        break;  
    // 取得裁剪后的圖片  
    case 3:  
        /**  
         * 非空判斷大家一定要驗證,如果不驗證的話,  
         * 在剪裁之后如果發現不滿意,要重新裁剪,丟棄  

         */  
        if(data != null){  
            setPicToView(data);  
        }  
        break;  
    default:  
        break;  

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

/**  
 * 裁剪圖片方法實現  
 * @param uri  
 */  
public void startPhotoZoom(Uri uri) {  
    /*  
     * 至于下面這個Intent的ACTION是怎么知道的,大家可以看下自己路徑下的如下網頁  
     * yourself_sdk_path/docs/reference/android/content/Intent.html  

     */  
    Intent intent = new Intent("com.android.camera.action.CROP");  
    intent.setDataAndType(uri, "image/*");  
    //下面這個crop=true是設置在開啟的Intent中設置顯示的VIEW可裁剪  
    intent.putExtra("crop", "true");  
    // aspectX aspectY 是寬高的比例  
    intent.putExtra("aspectX", 1);  
    intent.putExtra("aspectY", 1);  
    // outputX outputY 是裁剪圖片寬高  
    intent.putExtra("outputX", 150);  
    intent.putExtra("outputY", 150);  
    intent.putExtra("return-data", true);  
    startActivityForResult(intent, 3);  
}  

/**  
 * 保存裁剪之后的圖片數據  
 * @param picdata  
 */  
private void setPicToView(Intent picdata) {  
    Bundle extras = picdata.getExtras();  
    if (extras != null) {  
        Bitmap photo = extras.getParcelable("data");  
        Drawable drawable = new BitmapDrawable(photo);  

        /**  
         * 下面注釋的方法是將裁剪之后的圖片以Base64Coder的字符方式上  
         * 傳到服務器,QQ頭像上傳采用的方法跟這個類似  
         */  

        /*ByteArrayOutputStream stream = new ByteArrayOutputStream();  
        photo.compress(Bitmap.CompressFormat.JPEG, 60, stream);  
        byte[] b = stream.toByteArray();  
        // 將圖片流以字符串形式存儲下來  

        tp = new String(Base64Coder.encodeLines(b));  
        這個地方大家可以寫下給服務器上傳圖片的實現,直接把tp直接上傳就可以了,  
        服務器處理的方法是服務器那邊的事了,吼吼  

        如果下載到的服務器的數據還是以Base64Coder的形式的話,可以用以下方式轉換  
        為我們可以用的圖片類型就OK啦...吼吼  
        Bitmap dBitmap = BitmapFactory.decodeFile(tp);  
        Drawable drawable = new BitmapDrawable(dBitmap);  
        */  
        ib.setBackgroundDrawable(drawable);  
        iv.setBackgroundDrawable(drawable);  
    }  
}</pre><ol class="dp-xml" start="1"><li class="alt"></li>

</ol>

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!