Android上傳圖片裁剪功能
上傳圖片,相冊和拍照,獲取照片后裁剪:PicCutDemoActivity.java
package com.superspace;
import java.io.File;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
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.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.ImageView;
/**
* @Title: PicCutDemoActivity.java
* @Package com.superspace
* @Description: 圖片裁剪功能測試
* @author SuperSpace
*/
public class PicCutDemoActivity extends Activity implements OnClickListener {
private ImageButton ib = null;
private ImageView iv = null;
private Button bt = 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() {
bt = (Button) findViewById(R.id.bt);
ib = (ImageButton) findViewById(R.id.ib);
iv = (ImageView) findViewById(R.id.iv);
bt.setOnClickListener(this);
ib.setOnClickListener(this);
iv.setOnClickListener(this);
}
/**
* 控件點擊事件實現 因為有朋友問不同控件的背景圖裁剪怎么實現, 我就在這個地方用了三個控件,只為了自己記錄學習 大家覺得沒用的可以跳過啦
*/
public void onClick(View v) {
switch (v.getId()) {
case R.id.bt:
ShowPickDialog();
break;
case R.id.ib:
ShowPickDialog();
break;
case R.id.iv:
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(),
"superspace.jpg")));
startActivityForResult(intent, 2);
}
}).show();
}
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()
+ "/superspace.jpg");
startPhotoZoom(Uri.fromFile(temp));
break;
// 取得裁剪后的圖片
case 3:
/**
* 非空判斷大家一定要驗證,如果不驗證的話, 在剪裁之后如果發現不滿意,要重新裁剪,丟棄
* 當前功能時,會報NullException,只 在這個地方加下,大家可以根據不同情況在合適的 地方做判斷處理類似情況
*
*/
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
* 直接在里面Ctrl+F搜:CROP ,之前沒仔細看過,其實安卓系統早已經有自帶圖片裁剪功能, 是直接調本地庫的
*/
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);
}
}
}
main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:id ="@+id/test01" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> <Button android:id="@+id/bt" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="獲取圖片" /> <ImageButton android:id="@+id/ib" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/ic_launcher" /> <ImageView android:id="@+id/iv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/ic_launcher"/> </LinearLayout>
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!