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);
}
// 定向到圖片庫(kù)
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è)置在開(kāi)啟的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. 拍照返回圖片的地址問(wèn)題,一個(gè)目錄下的一個(gè)文件
3. 裁剪的圖片的地址, 覆蓋了全尺寸圖片的地址
4. 相冊(cè)intent 返回的是一個(gè)uir , 不是string
5. 裁剪的圖片,不能覆蓋相冊(cè)返回的uri(一定注意)
- Android編程實(shí)現(xiàn)調(diào)用相冊(cè)、相機(jī)及拍照后直接裁剪的方法
- Android 7.0中拍照和圖片裁剪適配的問(wèn)題詳解
- android系統(tǒng)拍照結(jié)合android-crop裁剪圖片
- Android調(diào)用系統(tǒng)拍照裁剪圖片模糊的解決方法
- Android實(shí)現(xiàn)拍照、選擇相冊(cè)圖片并裁剪功能
- Android拍照或從圖庫(kù)選擇圖片并裁剪
- Android實(shí)現(xiàn)拍照、選擇圖片并裁剪圖片功能
- Android實(shí)現(xiàn)從本地圖庫(kù)/相機(jī)拍照后裁剪圖片并設(shè)置頭像
- Android 拍照并對(duì)照片進(jìn)行裁剪和壓縮實(shí)例詳解
相關(guān)文章
Android中用onSaveInstanceState保存Fragment狀態(tài)的方法
這篇文章主要介紹了Android中用onSaveInstanceState保存Fragment狀態(tài)的方法,onSaveInstanceState可以將數(shù)據(jù)保存在Fragment或Activity中,需要的朋友可以參考下2016-04-04
Android retrofit上傳文件實(shí)例(包含頭像)
下面小編就為大家分享一篇Android retrofit上傳文件實(shí)例(包含頭像),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-01-01
Android模仿Toast實(shí)現(xiàn)提示框效果
這篇文章主要為大家詳細(xì)介紹了Android模仿Toast實(shí)現(xiàn)提示框效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08
Android實(shí)現(xiàn)Path平滑的涂鴉效果實(shí)例
這篇文章主要給大家介紹了關(guān)于Android實(shí)現(xiàn)Path平滑涂鴉效果的相關(guān)資料,通過(guò)本文介紹的方法修改后會(huì)讓線條平滑很多,文中給出了詳細(xì)的示例代碼供大家參考學(xué)習(xí),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-10-10
基于Android MarginLeft與MarginStart的區(qū)別(詳解)
下面小編就為大家分享一篇基于Android MarginLeft與MarginStart的區(qū)別(詳解),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2017-12-12
淺析KJFrameForAndroid框架如何高效加載Bitmap
Bitmap是Android系統(tǒng)中的圖像處理的最重要類之一。用它可以獲取圖像文件信息,進(jìn)行圖像剪切、旋轉(zhuǎn)、縮放等操作,并可以指定格式保存圖像文件。本文主要是從KJFrameForAndroid框架中分析高效加載Bitmap的方法2014-07-07
Android Rsa數(shù)據(jù)加解密的介紹與使用示例
RSA是第一個(gè)既能用于數(shù)據(jù)加密也能用于數(shù)字簽名的算法。它易于理解和操作,也很流行。想起自己曾經(jīng)使用過(guò)的Rsa非對(duì)稱加密算法,閑下來(lái)總結(jié)一下。方便自己和大家以后使用的時(shí)候參考借鑒。下面來(lái)一起看看吧。2016-09-09
Android從系統(tǒng)Gallery獲取圖片具體實(shí)現(xiàn)
這篇文章主要介紹了Android從系統(tǒng)Gallery獲取圖片具體實(shí)現(xiàn),有需要的朋友可以參考一下2013-12-12

