pro.Android Media–處理大的圖片

來源:互聯網
上載者:User

 

調用照相機程式,可以在intent中加入android.provider.MediaStore.EXTRA_OUTPUT 參數來設定圖片儲存位置。如下:

 

Java代碼
 
  1. String imageFilePath = Environment.getExternalStorageDirectory().getAbsolutePath()   
  2.         +"/myfavoritepicture.jpg";   
  3. File imageFile = new File(imageFilePath);   
  4. Uri imageFileUri = Uri.fromFile(imageFile);   
  5.            
  6. //      Uri imageFileUri = Uri.parse("file:///sdcard/myfavoritepicture.jpg");
      
  7.            
  8. Intent i = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);   
  9. i.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, imageFileUri);   
  10. 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代碼
 
  1. public class SizedCameraIntent extends Activity {   
  2.     final static int CAMERA_RESULT = 0;   
  3.        
  4.     ImageView mImagevView;   
  5.     String imageFilePath;   
  6.        
  7.     @Override  
  8.     protected void onCreate(Bundle savedInstanceState) {   
  9.         super.onCreate(savedInstanceState);   
  10.            
  11.         setContentView(R.layout.ch1);   
  12.            
  13.         imageFilePath = Environment.getExternalStorageDirectory().getAbsolutePath()   
  14.         +"/myfavoritepicture.jpg";   
  15.         File imageFile = new File(imageFilePath);   
  16.         Uri imageFileUri = Uri.fromFile(imageFile);   
  17.            
  18. //      Uri imageFileUri = Uri.parse("file:///sdcard/myfavoritepicture.jpg");
      
  19.            
  20.         Intent i = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);   
  21.         i.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, imageFileUri);   
  22.         startActivityForResult(i, CAMERA_RESULT);   
  23.     }   
  24.        
  25.     @Override  
  26.     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
      
  27.         super.onActivityResult(requestCode, resultCode, data);   
  28.            
  29.         if(resultCode == RESULT_OK){   
  30.             mImagevView = (ImageView)findViewById(R.id.returnedImageView);   
  31.                
  32.             Display currentDisplay = getWindowManager().getDefaultDisplay();   
  33.             int dw = currentDisplay.getWidth();   
  34.             int dh = currentDisplay.getHeight();   
  35.                
  36.             //得到圖片大小但是不載入圖片   
  37.             BitmapFactory.Options options = new BitmapFactory.Options();   
  38.             options.inJustDecodeBounds = true;   
  39.             Bitmap bmp = BitmapFactory.decodeFile(imageFilePath, options);   
  40.                
  41.             int heightRatio = (int)Math.ceil(options.outHeight/(float)dh);   
  42.             int widthRatio = (int)Math.ceil(options.outWidth/(float)dw);   
  43.                
  44.             if(heightRatio > 1 && widthRatio > 1){   
  45.                 if(heightRatio > widthRatio){   
  46.                     options.inSampleSize = heightRatio;   
  47.                 }else{   
  48.                     options.inSampleSize = widthRatio;   
  49.                 }   
  50.             }   
  51.                
  52.             //解析圖片   
  53.             options.inJustDecodeBounds = false;   
  54.             bmp = BitmapFactory.decodeFile(imageFilePath, options);   
  55.                
  56.             mImagevView.setImageBitmap(bmp);   
  57.                
  58.         }   
  59.     }   
  60. }  
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.