Android拍照裁剪圖片
下面是效果圖,看看是不是親想要的效果圖,如果是,這段代碼你就可以參考下了,但是要靈活運(yùn)用,根據(jù)需求做相應(yīng)的改動(dòng)。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <Button android:id="@+id/take_photo" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Take Photo" /> <Button android:id="@+id/get_photo" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="get Photo" /> <ImageView android:id="@+id/picture" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" /> </LinearLayout>
package com.example.choosepictest;
import java.io.File; import java.io.IOException; import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; 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.ImageView; public class MainActivity extends Activity implements OnClickListener { public static final int TAKE_PHOTO = 1; public static final int CROP_PHOTO = 2; public static final int GET_PHOTO = 3; private Button takePhoto; private Button getPhoto; private ImageView picture; private Uri headImgUri; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); takePhoto = (Button) findViewById(R.id.take_photo); getPhoto = (Button) findViewById(R.id.get_photo); picture = (ImageView) findViewById(R.id.picture); takePhoto.setOnClickListener(this); getPhoto.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.take_photo: takePhoto(); break; case R.id.get_photo: getPhoto(); break; default: break; } } // 拍照 private void takePhoto() { File appDir = new File(Environment.getExternalStorageDirectory(), "/etoury/picCache"); if (!appDir.exists()) { appDir.mkdir(); } String fileName = "user_head" + ".jpg"; File outputImage = new File(appDir, fileName); try { if (outputImage.exists()) { outputImage.delete(); } outputImage.createNewFile(); } catch (IOException e) { e.printStackTrace(); } headImgUri = Uri.fromFile(outputImage); Intent intent = new Intent("android.media.action.IMAGE_CAPTURE"); intent.putExtra(MediaStore.EXTRA_OUTPUT, headImgUri); startActivityForResult(intent, TAKE_PHOTO); } // 定向到圖片庫 private void getPhoto() { Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(intent, GET_PHOTO); } /** * 裁剪 */ private void crop(Uri uri) { // 裁剪圖片意圖 Intent intent = new Intent("com.android.camera.action.CROP"); intent.setDataAndType(uri, "image/*"); // 下面這個(gè)crop=true是設(shè)置在開啟的Intent中設(shè)置顯示的VIEW可裁剪 intent.putExtra("crop", "true"); intent.putExtra("scale", true);// 去黑邊 // 裁剪框的比例,1:1 intent.putExtra("aspectX", 1);// 輸出是X方向的比例 intent.putExtra("aspectY", 1); // 裁剪后輸出圖片的尺寸大小,不能太大500程序崩潰 intent.putExtra("outputX", 256); intent.putExtra("outputY", 256); // 圖片格式 /* intent.putExtra("outputFormat", "JPEG"); */ intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString()); // intent.putExtra("noFaceDetection", true);// 取消人臉識(shí)別 intent.putExtra("return-data", true);// true:返回uri,false:不返回uri // 同一個(gè)地址下 裁剪的圖片覆蓋拍照的圖片 intent.putExtra(MediaStore.EXTRA_OUTPUT, headImgUri); startActivityForResult(intent, CROP_PHOTO); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { case GET_PHOTO: if (resultCode == RESULT_OK) { crop(data.getData()); } break; case TAKE_PHOTO: if (resultCode == RESULT_OK) { crop(headImgUri); } break; case CROP_PHOTO: if (resultCode == RESULT_OK) { Bitmap cropbitmap = data.getParcelableExtra("data"); picture.setImageBitmap(cropbitmap); } break; default: break; } } }
總結(jié):
1. 拍照返回一張圖片,可以是全尺寸的圖片
2. 拍照返回圖片的地址問題,一個(gè)目錄下的一個(gè)文件
3. 裁剪的圖片的地址, 覆蓋了全尺寸圖片的地址
4. 相冊(cè)intent 返回的是一個(gè)uir , 不是string
5. 裁剪的圖片,不能覆蓋相冊(cè)返回的uri(一定注意)
- Android編程實(shí)現(xiàn)調(diào)用相冊(cè)、相機(jī)及拍照后直接裁剪的方法
- Android 7.0中拍照和圖片裁剪適配的問題詳解
- android系統(tǒng)拍照結(jié)合android-crop裁剪圖片
- Android調(diào)用系統(tǒng)拍照裁剪圖片模糊的解決方法
- Android實(shí)現(xiàn)拍照、選擇相冊(cè)圖片并裁剪功能
- Android拍照或從圖庫選擇圖片并裁剪
- Android實(shí)現(xiàn)拍照、選擇圖片并裁剪圖片功能
- Android實(shí)現(xiàn)從本地圖庫/相機(jī)拍照后裁剪圖片并設(shè)置頭像
- Android 拍照并對(duì)照片進(jìn)行裁剪和壓縮實(shí)例詳解
相關(guān)文章
Android 消息機(jī)制以及handler的內(nèi)存泄露
這篇文章主要介紹了Android 消息機(jī)制以及handler的內(nèi)存泄露的相關(guān)資料,需要的朋友可以參考下2016-09-09Android實(shí)現(xiàn)標(biāo)題顯示隱藏功能
這篇文章主要介紹了Android實(shí)現(xiàn)標(biāo)題顯示隱藏功能2016-02-02Android基于ibeacon實(shí)現(xiàn)藍(lán)牙考勤功能
這篇文章主要為大家詳細(xì)介紹了Android基于ibeacon實(shí)現(xiàn)藍(lán)牙考勤功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-10-10詳解Android 視頻播放時(shí)停止后臺(tái)運(yùn)行的方法
這篇文章主要介紹了詳解Android 視頻播放時(shí)停止后臺(tái)運(yùn)行的方法的相關(guān)資料,需要的朋友可以參考下2017-06-06