調用照相機程式,可以在intent中加入android.provider.MediaStore.EXTRA_OUTPUT 參數來設定圖片儲存位置。如下:
Java代碼
- String imageFilePath = Environment.getExternalStorageDirectory().getAbsolutePath()
- +"/myfavoritepicture.jpg";
- File imageFile = new File(imageFilePath);
- Uri imageFileUri = Uri.fromFile(imageFile);
-
- // Uri imageFileUri = Uri.parse("file:///sdcard/myfavoritepicture.jpg");
-
- Intent i = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
- i.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, imageFileUri);
- startActivityForResult(i, CAMERA_RESULT);
String imageFilePath = Environment.getExternalStorageDirectory().getAbsolutePath()+"/myfavoritepicture.jpg";File imageFile = new File(imageFilePath);Uri imageFileUri = Uri.fromFile(imageFile);//Uri imageFileUri = Uri.parse("file:///sdcard/myfavoritepicture.jpg");Intent i = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);i.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, imageFileUri);startActivityForResult(i, CAMERA_RESULT);
對於大的圖片,android載入的時候很有可能出現OOM(out of memory)。這個時候我們需要對圖片進行處理。
圖片載入到記憶體所佔空間
-------------------------------------------------------------------------------------------
一張解析度為1024×768,32位色彩的映像,其檔案大小約為?
一、基礎知識的掌握
首先我們必須明白,圖片的每個像素所佔的位元。
每個像素的位元,大體有如下幾類。
1位,(單色);4位:(16色);8位(256色);
16(64K色,高彩色);24(16M色,真彩色);32(4096M色,增強型真彩色)。
然後,你得明白,在電腦中的最小的儲存容量單位為Bit,即位的意思。
二、計算方法
①首先計算出該圖片的大小為多少個Bit
拿例題一來計算,就等於:
A、像素總數為:1024x768=786432個像素
B、每個像素佔32個Bit。
所以,該圖片所佔的總的Bit大小為:
1024x768x32=25165824Bit
②計算圖片所佔的磁碟儲存空間
這就需要您對磁碟儲存空間單位的換算有一定的掌握。使用總的Bit數轉換成為相應的KB、MB、GB等,就可以計算出結果了。
1Byte=8bit 1Kb=1024B 1Mb=1024KB
好了,有了如上的基礎,我們就可以計算出該圖片的所佔的儲存空間的大小了。
1024x768x32 現在單位為Bit
1024x768x32 ÷8 現在單位為Byte
1024x768x32 ÷8 ÷1024=3072KB 現在單位為KB
1024x768x32 ÷8 ÷1024 ÷1024
=3MB 現在單位為MB
-------------------------------------------------------
這裡可以看出圖片載入到記憶體是很大的,所以我們要對圖片進行處理
BitmapFactory.Options可以讓我們控制如何將bitmap讀入記憶體中
inSampleSize可以讓我們縮放圖片
inJustDecodeBounds設定為true,可以讓我們不用解析圖片就可以得到圖片大小。返回的圖片對象是null。我們可以得到圖片的資訊,但是不用為圖片分配記憶體
Java代碼
- public class SizedCameraIntent extends Activity {
- final static int CAMERA_RESULT = 0;
-
- ImageView mImagevView;
- String imageFilePath;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- setContentView(R.layout.ch1);
-
- imageFilePath = Environment.getExternalStorageDirectory().getAbsolutePath()
- +"/myfavoritepicture.jpg";
- File imageFile = new File(imageFilePath);
- Uri imageFileUri = Uri.fromFile(imageFile);
-
- // Uri imageFileUri = Uri.parse("file:///sdcard/myfavoritepicture.jpg");
-
- Intent i = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
- i.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, imageFileUri);
- startActivityForResult(i, CAMERA_RESULT);
- }
-
- @Override
- protected void onActivityResult(int requestCode, int resultCode, Intent data) {
- super.onActivityResult(requestCode, resultCode, data);
-
- if(resultCode == RESULT_OK){
- mImagevView = (ImageView)findViewById(R.id.returnedImageView);
-
- Display currentDisplay = getWindowManager().getDefaultDisplay();
- int dw = currentDisplay.getWidth();
- int dh = currentDisplay.getHeight();
-
- //得到圖片大小但是不載入圖片
- BitmapFactory.Options options = new BitmapFactory.Options();
- options.inJustDecodeBounds = true;
- Bitmap bmp = BitmapFactory.decodeFile(imageFilePath, options);
-
- int heightRatio = (int)Math.ceil(options.outHeight/(float)dh);
- int widthRatio = (int)Math.ceil(options.outWidth/(float)dw);
-
- if(heightRatio > 1 && widthRatio > 1){
- if(heightRatio > widthRatio){
- options.inSampleSize = heightRatio;
- }else{
- options.inSampleSize = widthRatio;
- }
- }
-
- //解析圖片
- options.inJustDecodeBounds = false;
- bmp = BitmapFactory.decodeFile(imageFilePath, options);
-
- mImagevView.setImageBitmap(bmp);
-
- }
- }
- }