【问题标题】:Why does image go blur?为什么图像会模糊?
【发布时间】:2015-04-06 12:07:17
【问题描述】:

我正在尝试开发一个使用 Android 相机 API 的应用。但是当我使用应用程序拍摄图像时,图像变得模糊。

图片使用谷歌相机应用:

使用我的相机应用的图像:

相机参数部分:

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());
        }

    }

【问题讨论】:

标签: android image android-camera


【解决方案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);

【讨论】:

  • 将此代码添加到设置参数的表面更改方法中
【解决方案2】:

你为什么不做这样的事情:

private static final int CAMERA_PICTURE = 3333;
Uri selectedImageUri;

在您的相机上执行此操作

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 
                }
           }
       }
    }

此方法将为您提供全分辨率图像,而不是缩略图或模糊图像。
干杯!!

【讨论】:

  • 谢谢你,但我必须在我的代码中使用 android camera api。
【解决方案3】:

评论您的相机 jpeg 质量:

param.setJpegQuality(100)

【讨论】:

    【解决方案4】:

    我认为您可能希望通过使用params.getSupportedPictureSizes() 查询支持的尺寸来强制输出图像分辨率,当您在发布的代码中设置相机参数时,选择最大的尺寸,然后设置它params.setPictureSize(),虽然我会觉得奇怪的是默认分辨率会像您发布的示例一样小。

    【讨论】:

      【解决方案5】:

      您需要使用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();
              }
          }
      

      【讨论】:

        猜你喜欢
        • 2023-03-08
        • 1970-01-01
        • 2022-12-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-19
        • 2019-10-23
        • 2013-12-13
        相关资源
        最近更新 更多