0
Intent(MediaStore.ACTION_IMAGE_CAPTURE) 

我正在拍照。我能夠從onActivityResult相機意圖結果圖像尺寸

拿相機的畫面,我需要的圖片尺寸要小一些(如果可能的話自定義)

這是相機應用應該給我200萬像素(兆像素級)或圖像一些726 KB(大小明智)的輸出。

任何Camera.putExtra將爲此工作?

回答

0

也許看看EXTRA_SIZE_LIMIT,我還沒有嘗試過 - 閱讀其他答案似乎是這樣不是工作與特定的行動。

否則,一個簡單的解決方案是爲圖像指定EXTRA_OUTPUT位置,然後在接收位置將該圖像採樣到合適的文件大小。

另外,也許你應該看看this project on github,試圖處理捕獲圖像中的所有問題,這似乎能夠控制圖片大小。

+0

我會嘗試..沒有這些東西的具體文件? –

0
// try this 
public class ScalingUtilities { 

    /** 
    * Utility function for decoding an image resource. The decoded bitmap will 
    * be optimized for further scaling to the requested destination dimensions 
    * and scaling logic. 
    * 
    * @param res The resources object containing the image data 
    * @param resId The resource id of the image data 
    * @param dstWidth Width of destination area 
    * @param dstHeight Height of destination area 
    * @param scalingLogic Logic to use to avoid image stretching 
    * @return Decoded bitmap 
    */ 
    public static Bitmap decodeResource(Resources res, int resId, int dstWidth, int dstHeight, 
      ScalingLogic scalingLogic) { 
     Options options = new Options(); 
     options.inJustDecodeBounds = true; 
     BitmapFactory.decodeResource(res, resId, options); 
     options.inJustDecodeBounds = false; 
     options.inSampleSize = calculateSampleSize(options.outWidth, options.outHeight, dstWidth, 
       dstHeight, scalingLogic); 
     Bitmap unscaledBitmap = BitmapFactory.decodeResource(res, resId, options); 

     return unscaledBitmap; 
    } 
    public static Bitmap decodeFile(String path, int dstWidth, int dstHeight, 
      ScalingLogic scalingLogic) { 
     Options options = new Options(); 
     options.inJustDecodeBounds = true; 
     BitmapFactory.decodeFile(path, options); 
     options.inJustDecodeBounds = false; 
     options.inSampleSize = calculateSampleSize(options.outWidth, options.outHeight, dstWidth, 
       dstHeight, scalingLogic); 
     Bitmap unscaledBitmap = BitmapFactory.decodeFile(path, options); 

     return unscaledBitmap; 
    } 

    /** 
    * Utility function for creating a scaled version of an existing bitmap 
    * 
    * @param unscaledBitmap Bitmap to scale 
    * @param dstWidth Wanted width of destination bitmap 
    * @param dstHeight Wanted height of destination bitmap 
    * @param scalingLogic Logic to use to avoid image stretching 
    * @return New scaled bitmap object 
    */ 
    public static Bitmap createScaledBitmap(Bitmap unscaledBitmap, int dstWidth, int dstHeight, 
      ScalingLogic scalingLogic) { 
     Rect srcRect = calculateSrcRect(unscaledBitmap.getWidth(), unscaledBitmap.getHeight(), 
       dstWidth, dstHeight, scalingLogic); 
     Rect dstRect = calculateDstRect(unscaledBitmap.getWidth(), unscaledBitmap.getHeight(), 
       dstWidth, dstHeight, scalingLogic); 
     Bitmap scaledBitmap = Bitmap.createBitmap(dstRect.width(), dstRect.height(), 
       Config.ARGB_8888); 
     Canvas canvas = new Canvas(scaledBitmap); 
     canvas.drawBitmap(unscaledBitmap, srcRect, dstRect, new Paint(Paint.FILTER_BITMAP_FLAG)); 

     return scaledBitmap; 
    } 

    /** 
    * ScalingLogic defines how scaling should be carried out if source and 
    * destination image has different aspect ratio. 
    * 
    * CROP: Scales the image the minimum amount while making sure that at least 
    * one of the two dimensions fit inside the requested destination area. 
    * Parts of the source image will be cropped to realize this. 
    * 
    * FIT: Scales the image the minimum amount while making sure both 
    * dimensions fit inside the requested destination area. The resulting 
    * destination dimensions might be adjusted to a smaller size than 
    * requested. 
    */ 
    public static enum ScalingLogic { 
     CROP, FIT 
    } 

    /** 
    * Calculate optimal down-sampling factor given the dimensions of a source 
    * image, the dimensions of a destination area and a scaling logic. 
    * 
    * @param srcWidth Width of source image 
    * @param srcHeight Height of source image 
    * @param dstWidth Width of destination area 
    * @param dstHeight Height of destination area 
    * @param scalingLogic Logic to use to avoid image stretching 
    * @return Optimal down scaling sample size for decoding 
    */ 
    public static int calculateSampleSize(int srcWidth, int srcHeight, int dstWidth, int dstHeight, 
      ScalingLogic scalingLogic) { 
     if (scalingLogic == ScalingLogic.FIT) { 
      final float srcAspect = (float)srcWidth/(float)srcHeight; 
      final float dstAspect = (float)dstWidth/(float)dstHeight; 

      if (srcAspect > dstAspect) { 
       return srcWidth/dstWidth; 
      } else { 
       return srcHeight/dstHeight; 
      } 
     } else { 
      final float srcAspect = (float)srcWidth/(float)srcHeight; 
      final float dstAspect = (float)dstWidth/(float)dstHeight; 

      if (srcAspect > dstAspect) { 
       return srcHeight/dstHeight; 
      } else { 
       return srcWidth/dstWidth; 
      } 
     } 
    } 

    /** 
    * Calculates source rectangle for scaling bitmap 
    * 
    * @param srcWidth Width of source image 
    * @param srcHeight Height of source image 
    * @param dstWidth Width of destination area 
    * @param dstHeight Height of destination area 
    * @param scalingLogic Logic to use to avoid image stretching 
    * @return Optimal source rectangle 
    */ 
    public static Rect calculateSrcRect(int srcWidth, int srcHeight, int dstWidth, int dstHeight, 
      ScalingLogic scalingLogic) { 
     if (scalingLogic == ScalingLogic.CROP) { 
      final float srcAspect = (float)srcWidth/(float)srcHeight; 
      final float dstAspect = (float)dstWidth/(float)dstHeight; 

      if (srcAspect > dstAspect) { 
       final int srcRectWidth = (int)(srcHeight * dstAspect); 
       final int srcRectLeft = (srcWidth - srcRectWidth)/2; 
       return new Rect(srcRectLeft, 0, srcRectLeft + srcRectWidth, srcHeight); 
      } else { 
       final int srcRectHeight = (int)(srcWidth/dstAspect); 
       final int scrRectTop = (int)(srcHeight - srcRectHeight)/2; 
       return new Rect(0, scrRectTop, srcWidth, scrRectTop + srcRectHeight); 
      } 
     } else { 
      return new Rect(0, 0, srcWidth, srcHeight); 
     } 
    } 

    /** 
    * Calculates destination rectangle for scaling bitmap 
    * 
    * @param srcWidth Width of source image 
    * @param srcHeight Height of source image 
    * @param dstWidth Width of destination area 
    * @param dstHeight Height of destination area 
    * @param scalingLogic Logic to use to avoid image stretching 
    * @return Optimal destination rectangle 
    */ 
    public static Rect calculateDstRect(int srcWidth, int srcHeight, int dstWidth, int dstHeight, 
      ScalingLogic scalingLogic) { 
     if (scalingLogic == ScalingLogic.FIT) { 
      final float srcAspect = (float)srcWidth/(float)srcHeight; 
      final float dstAspect = (float)dstWidth/(float)dstHeight; 

      if (srcAspect > dstAspect) { 
       return new Rect(0, 0, dstWidth, (int)(dstWidth/srcAspect)); 
      } else { 
       return new Rect(0, 0, (int)(dstHeight * srcAspect), dstHeight); 
      } 
     } else { 
      return new Rect(0, 0, dstWidth, dstHeight); 
     } 
    } 

}