轉載聲明:Ryan的博客文章歡迎您的轉載,但在轉載的同時,請註明文章的來源出處,不勝感激!
:-)
http://my.oschina.net/ryanhoo/blog/86853
在這篇博客中,我將向大家展示如何從相冊截圖。
上一篇博客中,我就拍照截圖這一需求進行了詳細的分析,試圖讓大家瞭解Android本身的限制,以及我們應當採取的實現方案。
根據我們的分析與總結,圖片的來源有拍照和相冊,而可採取的操作有
- 使用Bitmap並返回數據
- 使用Uri不返回數據
前面我們瞭解到,使用Bitmap有可能會導致圖片過大,而不能返回實際大小的圖片,我將採用大圖Uri,小圖Bitmap的數據存儲方式。
我們將要使用到URI來保存拍照後的圖片:
1
2
|
private
static
final
String IMAGE_FILE_LOCATION = "file:///sdcard/temp.jpg" ;//temp
file Uri
imageUri = Uri.parse(IMAGE_FILE_LOCATION); //The
Uri to store the big bitmap |
不難知道,我們從相冊選取圖片的Action爲Intent.ACTION_GET_CONTENT。
根據我們上一篇博客的分析,我準備好了兩個實例的Intent。
一、從相冊截大圖:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
Intent
intent = new
Intent(Intent.ACTION_GET_CONTENT, null ); intent.setType( "image/*" ); intent.putExtra( "crop" ,
"true" ); intent.putExtra( "aspectX" ,
2 ); intent.putExtra( "aspectY" ,
1 ); intent.putExtra( "outputX" ,
600 ); intent.putExtra( "outputY" ,
300 ); 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" ,
true );
//
no face detection startActivityForResult(intent,
CHOOSE_BIG_PICTURE); |
1
2
3
4
5
6
7
8
9
10
11
12
|
Intent
intent = new
Intent(Intent.ACTION_GET_CONTENT, null ); intent.setType( "image/*" ); intent.putExtra( "crop" ,
"true" ); intent.putExtra( "aspectX" ,
2 ); intent.putExtra( "aspectY" ,
1 ); intent.putExtra( "outputX" ,
200 ); intent.putExtra( "outputY" ,
100 ); intent.putExtra( "scale" ,
true ); intent.putExtra( "return-data" ,
true ); intent.putExtra( "outputFormat" ,
Bitmap.CompressFormat.JPEG.toString()); intent.putExtra( "noFaceDetection" ,
true );
//
no face detection startActivityForResult(intent,
CHOOSE_SMALL_PICTURE); |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
switch
(requestCode) { case
CHOOSE_BIG_PICTURE: Log.d(TAG,
"CHOOSE_BIG_PICTURE:
data = "
+ data); //it
seems to be null if (imageUri
!= null ){ Bitmap
bitmap = decodeUriAsBitmap(imageUri); //decode
bitmap imageView.setImageBitmap(bitmap); } break ; case
CHOOSE_SMALL_PICTURE: if (data
!= null ){ Bitmap
bitmap = data.getParcelableExtra( "data" ); imageView.setImageBitmap(bitmap); } else { Log.e(TAG,
"CHOOSE_SMALL_PICTURE:
data = "
+ data); } break ; default : break ; } |
1
2
3
4
5
6
7
8
9
10
|
private
Bitmap decodeUriAsBitmap(Uri uri){ Bitmap
bitmap = null ; try
{ bitmap
= BitmapFactory.decodeStream(getContentResolver().openInputStream(uri)); }
catch
(FileNotFoundException e) { e.printStackTrace(); return
null ; } return
bitmap; } |
效果圖:
大圖 | 小圖 |
|
|