2015-04-06 145 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