2013年1月20日 星期日

[Android]取得相機照片後儲存方法

在開發Android相機應用時,處理照片檔案是必經的過程,首先要面對的相片儲存的位置,依應用程式的需求,可將照片儲存至外部的SDCard裡,或是內部的記憶體(內存)中,這兩種儲存位置的做法不太相同,分別介紹兩種方法。

儲存至內部記憶體(內存):

以下程式碼是將照片以.JPG檔的形式儲存至內部記憶體中

PictureCallback camJpegCallback = new PictureCallback() {
  public void onPictureTaken(byte[] data, Camera camera) {
  // 用來接收壓縮成jpeg格式的影像資料
  
  FileOutputStream outStream = null;
  try {
   //儲存在內部記憶體
   Bitmap bm =BitmapFactory.decodeByteArray(data, 0, data.length);
   outStream = openFileOutput("photo.jpg", Context.MODE_PRIVATE);
   bm.compress(CompressFormat.JPEG, 80, outStream);
   outStream.flush();
   outStream.close();
   Toast.makeText(PKActivity.this, "存檔完成!", Toast.LENGTH_SHORT)
   .show();
   Intent intent=new Intent();
   intent.setClass(PKActivity.this, PK_ResultActivity.class);
   startActivity(intent);
   PKActivity.this.finish(); 
  
  
  } catch (IOException e) {
   Toast.makeText(PKActivity.this, "影像檔儲存錯誤!", Toast.LENGTH_SHORT)
   .show();
  }


程式說明:


Bitmap bm =BitmapFactory.decodeByteArray(data, 0, data.length);

將char[] 轉換成Bitmap 的形式。


FileOutputStream outStream = openFileOutput("FileName",MODE_WORLD_READABLE);


使用openFileOutput來建立FileOutputStream 。
FileName只要檔名即可,不用完整路徑。
Context.MODE_PRIVATE:代表該檔是私有資料,只能被APP本身存取。如果檔案已存在,會覆蓋原檔。 Context.MODE_APPEND:會檢查檔案是否存在,檔案存在會將內容新增檔案內;如檔案不存在就建立新檔。 Context.MODE_WORLD_READABLE:其它應用程式也可以讀取。如果要在APP中使用 intent.ACTION_SEND,要使用此模式。
Context.MODE_WORLD_WRITEABLE:其它應用程式也可以寫入此檔。 Context.MODE_PRIVATE:代表該檔是私有資料,只能被APP本身存取。如果檔案已存在,會覆蓋原檔。
Context.MODE_APPEND:會檢查檔案是否存在,檔案存在會將內容新增檔案內;如檔案不存在就建立新檔。 Context.MODE_WORLD_READABLE:其它應用程式也可以讀取。如果要在APP中使用 intent.ACTION_SEND,要使用此模式。
Context.MODE_WORLD_WRITEABLE:其它應用程式也可以寫入此檔。
Context.MODE_APPEND:會檢查檔案是否存在,檔案存在會將內容新增檔案內;如檔案不存在就建立新檔。 Context.MODE_WORLD_READABLE:其它應用程式也可以讀取。如果要在APP中使用 intent.ACTION_SEND,要使用此模式。
Context.MODE_WORLD_WRITEABLE:其它應用程式也可以寫入此檔。 Context.MODE_WORLD_READABLE:其它應用程式也可以讀取。如果要在APP中使用 intent.ACTION_SEND,要使用此模式。
Context.MODE_WORLD_WRITEABLE:其它應用程式也可以寫入此檔。 Context.MODE_WORLD_WRITEABLE:其它應用程式也可以寫入此檔。

bm.compress(CompressFormat.JPEG, 80, outStream);


將Bitnap以80%的壓縮存成JPG檔,用FileOutputStream 方式存入。


儲存至SD卡


PictureCallback camJpegCallback = new PictureCallback() {
  public void onPictureTaken(byte[] data, Camera camera) {
  // 用來接收壓縮成jpeg格式的影像資料
  FileOutputStream outStream = null;
  try {
   //儲存在外部SD
   outStream = new FileOutputStream("/sdcard/photo.jpg");
   outStream.write(data);
   outStream.close();
   Toast.makeText(PKActivity.this, "存檔完成!", Toast.LENGTH_SHORT)
   .show();
   Intent intent=new Intent();
   intent.setClass(PKActivity.this, PK_ResultActivity.class);
   startActivity(intent);
   PKActivity.this.finish(); 
  
  
  } catch (IOException e) {
   Toast.makeText(PKActivity.this, "影像檔儲存錯誤!", Toast.LENGTH_SHORT)
   .show();
  }

沒有留言:

張貼留言