2015-04-06 143 views
1

我想開發一個使用android相機API的應用程序。但是當我拍攝使用應用程序圖像的圖像變得模糊。爲什麼圖像模糊?

圖片使用谷歌的相機應用:使用

enter image description here

圖片我的相機應用:

enter image description here

相機參數部分:

Camera.Parameters param; 
param = camera.getParameters(); 
param.setFocusMode(Parameters.FOCUS_MODE_FIXED); 
param.setPictureFormat(ImageFormat.JPEG); 
param.setJpegQuality(100); 
camera.setParameters(param); 
camera.startPreview(); 

圖片回調部分:

public void onPictureTaken(byte[] data, Camera camera) { 

     bitmap = BitmapFactory.decodeByteArray(data, 0, data.length); 
     camera.release(); 
     preview.setVisibility(View.INVISIBLE); 
     image.setVisibility(View.VISIBLE); 
     image.setImageBitmap(bitmap); 
     File pictureFile = getOutputMediaFile(); 
     if (pictureFile == null) { 
      Log.d("PictureCall", 
        "Error creating media file, check storage permissions"); 
      return; 
     } 

     try { 
      FileOutputStream fos = new FileOutputStream(pictureFile); 
      fos.write(data); 
      fos.close(); 
     } catch (FileNotFoundException e) { 
      Log.d("File Excep :", "File not found: " + e.getMessage()); 
     } catch (IOException e) { 
      Log.d("File Excep :", "Error accessing file: " + e.getMessage()); 
     } 

    } 
+0

http://stackoverflow.com/a/5163778/3330969。 – Kedarnath 2015-04-06 12:10:44

+0

您是否正在儲存預覽圖像? – Stan 2015-04-06 12:12:07

+0

我已經嘗試過,但它不起作用。 – patrick 2015-04-06 12:12:19

回答

0

你爲什麼不這樣做:

private static final int CAMERA_PICTURE = 3333; 
Uri selectedImageUri; 

在您的相機BTN做到這一點

Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
startActivityForResult(cameraIntent, CAMERA_PICTURE); 

,並在你的onActivityResult編寫代碼

public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (resultCode == RESULT_OK) { 
     if (requestCode==CAMERA_PICTURE) { 
      selectedImageUri = data.getData(); 

      if(selectedImageUri!=null){ 

     Bitmap bmp=BitmapFactory.decodeStream(getContentResolver().openInputStream(selectedImageUri)); 
     //perform operations with your bitmap here 
       } 
      } 
     } 
    } 

這種方法會給你一個完整的r解析圖像而不是縮略圖或模糊的圖像。
乾杯!

+0

感謝這一點,但我必須在我的代碼中使用android相機api。 – patrick 2015-04-06 12:25:58

0

評論你的相機JPEG畫質:

param.setJpegQuality(100) 
+0

它不工作:( – patrick 2015-04-06 14:38:53

0

我想你可能想通過查詢支持的尺寸與params.getSupportedPictureSizes(),選擇最大的一個,然後將其設置params.setPictureSize()當你強迫你的圖片拍攝的輸出圖像分辨率在發佈的代碼中設置你的相機參數,但是我會發現奇怪的是,默認分辨率會像你發佈的樣本那麼小。

0

您需要使用setPictureSize()setPreviewSize()方法,並設置最佳圖片尺寸&預覽尺寸可從getSupportedPreviewSizes()

檢查以下方法的代碼(來自該answer

 /** 
    * Set Camera parameters for Best image quality available 
    * 
    * @param mCamera Camera object 
    */ 
    public void setCameraParameters(Camera mCamera) { 
     Camera.Parameters mCameraParams; 

     // Set Camera Parameters for best image quality available 
     if (mCamera != null) { 
      mCamera.stopPreview(); 
      mCameraParams = mCamera.getParameters(); 

      Camera.Size bestSizeAvailable = null; 
      List<Camera.Size> listPreviewSizes = mCamera.getParameters().getSupportedPreviewSizes(); 
      bestSizeAvailable = listPreviewSizes.get(0); 
      for (int i = 1; i < listPreviewSizes.size(); i++) { 
       if ((listPreviewSizes.get(i).width * listPreviewSizes.get(i).height) > (bestSizeAvailable.width * bestSizeAvailable.height)) { 
        bestSizeAvailable = listPreviewSizes.get(i); 
       } 
      } 

      List<Integer> listSupportedPreviewFormats = mCameraParams.getSupportedPreviewFormats(); 
      Iterator<Integer> iteratorSupportedPreviewFormats = listSupportedPreviewFormats.iterator(); 
      while (iteratorSupportedPreviewFormats.hasNext()) { 
       Integer previewFormat = iteratorSupportedPreviewFormats.next(); 
       if (previewFormat == ImageFormat.YV12) { 
        mCameraParams.setPreviewFormat(previewFormat); 
       } 
      } 

      mCameraParams.setPreviewSize(bestSizeAvailable.width, bestSizeAvailable.height); 
      mCameraParams.setPictureSize(bestSizeAvailable.width, bestSizeAvailable.height); 
      mCamera.setParameters(mCameraParams); 
      mCamera.startPreview(); 
     } 
    } 
1
Camera.Parameters parameters = camera.getParameters(); 
List<Camera.Size> sizes = parameters.getSupportedPictureSizes(); 
      for (Camera.Size size : sizes) { 
       if (size.width > w || size.height > h) { 
        w = size.width; 
        h = size.height; 
       } 
      } 
      parameters.setPictureSize(w, h); 
+0

添加此代碼到你的表面更改方法設置參數 – 2017-05-03 09:59:05