2013-10-29 10 views
0

我有一個問題,我使用下面的代碼拍照:Android如何獲取保存在SD卡上的圖像,調整大小並保存一次?

private void captureImage() { 
      Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 

      fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE); 

      intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); 

      // start the image capture Intent 
      startActivityForResult(intent, CAMERA_CAPTURE_IMAGE_REQUEST_CODE); 
     } 

創造了fileURI的功能是這樣的:

public Uri getOutputMediaFileUri(int type) { 
      return Uri.fromFile(getOutputMediaFile(type)); 
     } 

     /* 
     * returning image/video 
     */ 
     private static File getOutputMediaFile(int type) { 

      // External sdcard location 
      File mediaStorageDir = new File(
        Environment 
          .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), 
        IMAGE_DIRECTORY_NAME); 

      // Create the storage directory if it does not exist 
      if (!mediaStorageDir.exists()) { 
       if (!mediaStorageDir.mkdirs()) { 
        Log.d(IMAGE_DIRECTORY_NAME, "Creación fallida " 
          + IMAGE_DIRECTORY_NAME + " directory"); 
        return null; 
       } 
      } 

      // Create a media file name 
      String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", 
        Locale.getDefault()).format(new Date()); 
      File mediaFile; 
      if (type == MEDIA_TYPE_IMAGE) { 
       mediaFile = new File(mediaStorageDir.getPath() + File.separator 
         + "IMGTRAF_" + timeStamp + ".jpg"); 
      } else if (type == MEDIA_TYPE_VIDEO) { 
       mediaFile = new File(mediaStorageDir.getPath() + File.separator 
         + "VIDTRAF_" + timeStamp + ".mp4"); 
      } else { 
       return null; 
      } 

      return mediaFile; 
     } 

,在這裏我展示形象在ImageView的:

@Override 
     protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
      // if the result is capturing Image 
      if (requestCode == CAMERA_CAPTURE_IMAGE_REQUEST_CODE) { 
       if (resultCode == RESULT_OK) { 
        // successfully captured the image 
        // display it in image view 
        previewCapturedImage(); 
        Toast.makeText(getApplicationContext(), 
          "Mostrando foto", Toast.LENGTH_SHORT) 
          .show(); 
       } else if (resultCode == RESULT_CANCELED) { 
        // user cancelled Image capture 
        Toast.makeText(getApplicationContext(), 
          "Acción cancelada", Toast.LENGTH_SHORT) 
          .show(); 
       } else { 
        // failed to capture image 
        Toast.makeText(getApplicationContext(), 
          "Error al capturar la imagen", Toast.LENGTH_SHORT) 
          .show(); 
       } 
      } else if (requestCode == CAMERA_CAPTURE_VIDEO_REQUEST_CODE) { 
       if (resultCode == RESULT_OK) { 
        // video successfully recorded 
        // preview the recorded video 
        previewVideo(); 
        Toast.makeText(getApplicationContext(), 
          "Reproduciendo video", Toast.LENGTH_SHORT) 
          .show(); 
       } else if (resultCode == RESULT_CANCELED) { 
        // user cancelled recording 
        Toast.makeText(getApplicationContext(), 
          "Acción cancelada", Toast.LENGTH_SHORT) 
          .show(); 
       } else { 
        // failed to record video 
        Toast.makeText(getApplicationContext(), 
          "Error al capturar el video", Toast.LENGTH_SHORT) 
          .show(); 
       } 
      } 
     } 

     /* 
     * Display image from a path to ImageView 
     */ 
     private void previewCapturedImage() { 
      try { 
       // hide video preview 
       videoPreview.setVisibility(View.GONE); 

       imgPreview.setVisibility(View.VISIBLE); 

       // bimatp factory 
       BitmapFactory.Options options = new BitmapFactory.Options(); 

       // downsizing image as it throws OutOfMemory Exception for larger 
       // images 
       options.inSampleSize = 8; 

       final Bitmap bitmap = BitmapFactory.decodeFile(fileUri.getPath(), 
         options); 

       imgPreview.setImageBitmap(bitmap); 
      } catch (NullPointerException e) { 
       e.printStackTrace(); 
      } 
     } 

的問題是,當我捕捉圖像它被保存在它的原始尺寸(1954 * 2560),當我把它上傳到服務器需要一個很長時間。我在這裏看到很多問題和答案,但沒有一個適合我。我想拍照,將其大小調整爲800x600,然後再保存一次,以便將其上傳到服務器。

我該如何做到這一點?請考慮我對Android編程非常陌生。

謝謝!

最後我已經這樣做解決了這個問題:

private void previewCapturedImage() { 
      try { 
       // hide video preview 
       videoPreview.setVisibility(View.GONE); 

       imgPreview.setVisibility(View.VISIBLE); 

       // bimatp factory 
       BitmapFactory.Options options = new BitmapFactory.Options(); 

       // downsizing image as it throws OutOfMemory Exception for larger 
       // images 
       options.inSampleSize = 8; 

       final Bitmap bitmap = BitmapFactory.decodeFile(fileUri.getPath(), 
         options); 

       File mediaStorageDir = new File(
         Environment 
           .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), 
         IMAGE_DIRECTORY_NAME); 

       String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", 
         Locale.getDefault()).format(new Date()); 
       File file; 
       file = new File(fileUri.getPath()); 
       try { 
        FileOutputStream out = new FileOutputStream(file); 
        bitmap.compress(Bitmap.CompressFormat.JPEG, 90, out); 
        out.flush(); 
        out.close(); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 

       //fileUri = file; 

       imgPreview.setImageBitmap(bitmap); 
      } catch (NullPointerException e) { 
       e.printStackTrace(); 
      } 
     } 

我希望它可以幫助別人在不久的將來。

+0

你可以上傳前調整圖像大小..哪裏是你的代碼,上傳之前讀取圖像? –

+0

感謝您的回答,是我張貼的最後一段代碼中的previewCapturedImage()函數。 –

回答

0

解決這個:

private void previewCapturedImage() { 
      try { 
       // hide video preview 
       videoPreview.setVisibility(View.GONE); 

       imgPreview.setVisibility(View.VISIBLE); 

       // bimatp factory 
       BitmapFactory.Options options = new BitmapFactory.Options(); 

       // downsizing image as it throws OutOfMemory Exception for larger 
       // images 
       options.inSampleSize = 8; 

       final Bitmap bitmap = BitmapFactory.decodeFile(fileUri.getPath(), 
         options); 

       File mediaStorageDir = new File(
         Environment 
           .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), 
         IMAGE_DIRECTORY_NAME); 

       String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", 
         Locale.getDefault()).format(new Date()); 
       File file; 
       file = new File(fileUri.getPath()); 
       try { 
        FileOutputStream out = new FileOutputStream(file); 
        bitmap.compress(Bitmap.CompressFormat.JPEG, 90, out); 
        out.flush(); 
        out.close(); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 

       //fileUri = file; 

       imgPreview.setImageBitmap(bitmap); 
      } catch (NullPointerException e) { 
       e.printStackTrace(); 
      } 
     } 
相關問題