使用自定义相机的图像质量很差

Posted

技术标签:

【中文标题】使用自定义相机的图像质量很差【英文标题】:Image quality is poor using custom camera 【发布时间】:2017-02-06 02:17:51 【问题描述】:

我正在使用自定义相机并且工作正常,但问题是图像以非常低(差)的质量保存。为了克服它,我尝试了所有建议和实现。喜欢,

parameters.setJpegQuality(100);
parameters.setPictureFormat(ImageFormat.JPEG);

这不起作用。之后我用过

List<Size> sizes = cameraParams.getSupportedPictureSizes();
Camera.Size size = sizes.get(0);
for(int i=0;i<sizes.size();i++)

 if(sizes.get(i).width > size.width)
 size = sizes.get(i);

cameraParams.setPictureSize(mPictureSize.width, mPictureSize.height);

这也行不通。它的质量仍然很差。

注意:相机预览显示正确且质量良好,但问题在于将捕获的图像保存到 sdcard 文件夹时。

高级帮助将不胜感激!

【问题讨论】:

在你的第二个代码之后你调整你的Image?? 您在更改这些参数后终于将这些参数添加到您的相机中了吗?像 mCamera.setParameters(cameraParams); 您是如何从相机中拍照的?你能显示代码吗? @Prateek 是的,我做到了 @Ironman 不,我没有 【参考方案1】:

我的问题终于解决了。

在这里我在捕捉图像之前设置parameters 用于相机预览

 public void takePicture() 
    mCamera.takePicture(new ShutterCallback() 
        @Override
        public void onShutter() 

        
    , new PictureCallback() 
        @Override
        public void onPictureTaken(byte[] data, Camera camera) 

        
    , new PictureCallback() 
        @Override
        public void onPictureTaken(final byte[] data, Camera camera) 

            data1 = data;
            if (mCamera != null) 
                mCamera.stopPreview();
            
        
    );

所以在我在片段中调用这个函数之前,我已经在这个方法之前设置了参数。

mPreview.setParams(params);// This was the mistake what i have done !
mPreview.takePicture();

去掉mPreview.setParams(params);后终于解决了

【讨论】:

我在找这个,你能告诉我你用的是什么定制相机吗?像任何图书馆一样!提前谢谢你。 没有。我没有使用任何自定义库。我已经使用自定义类进行相机预览,之后我根据我的要求进行了修改!您正在使用自定义相机吗? @RuchaBhatt 您能否详细说明您的解决方案。我将参数设置为 mCamera 而不是 mPreview。我在 mCamera.startPreview(); 之前设置参数但我得到的是低质量的图像。 私人无效 setCameraParams() Camera.Parameters params = mCamera.getParameters();列表 大小 = params.getSupportedPictureSizes(); Camera.Size size = sizes.get(0); for (int i = 0; i size.width) size = sizes.get(i); params.setPictureSize(size.width, size.height); Camera.Size bestSize = null; List sizeList = params.getSupportedPreviewSizes(); bestSize = sizeList.get(0); for(int i = 1; i (bestSize .width * bestSize.height)) bestSize = sizeList.get(i); params.setPreviewSize(bestSize.width,bestSize.height); params.setFlashMode(Camera.Parameters.FLASH_MODE_AUTO); params.setPictureFormat(ImageFormat.JPEG); params.setJpegQuality(100); params.setRotation(90); mCamera.setDisplayOrientation(90); mCamera.setParameters(params); 【参考方案2】:

我可以告诉你重置预览大小的方法:

您应该在相机上更改预览参数。

private void setImageSize() 
        Camera.Size size = CameraUtil.findClosetImageSize(mRxCamera.getNativeCamera(), PREFER_SIZE);
        mCamera.getNativeCamera().getParameters().setPictureSize(size.width, size.height);
        WIDTH = size.width;
        HEIGHT = size.height;
    

之后你需要改变布局大小

private void resetPreviewSize() 
        final boolean widthIsMax = mWidth > mHeight;
        final Camera.Size size = mCamera.getNativeCamera().getParameters().getPreviewSize();

        final RectF rectDisplay = new RectF();
        final RectF rectPreview = new RectF();

        rectDisplay.set(0, 0, mWidth, mHeight);

        final int width = widthIsMax ? size.width : size.height;
        final int height = widthIsMax ? size.height : size.width;
        rectPreview.set(0, 0, width, height);

        final Matrix matrix = new Matrix();
        matrix.setRectToRect(rectDisplay, rectPreview, Matrix.ScaleToFit.START);
        matrix.invert(matrix);
        matrix.mapRect(rectPreview);

        mCameraView.getLayoutParams().height = (int) (rectPreview.bottom);
        mCameraView.getLayoutParams().width = (int) (rectPreview.right);
        mCameraView.requestLayout();
    

如果你需要

public static Camera.Size findClosetImageSize(Camera camera, Point preferSize) 
    int preferX = preferSize.x;
    int preferY = preferSize.y;
    Camera.Parameters parameters = camera.getParameters();
    List<Camera.Size> allSupportSizes = parameters.getSupportedPictureSizes();
    Log.d(TAG, "all support Image size: " + dumpPreviewSizeList(allSupportSizes));
    int minDiff = Integer.MAX_VALUE;
    int index = 0;
    for (int i = 0; i < allSupportSizes.size(); i++) 
        Camera.Size size = allSupportSizes.get(i);
        int x = size.width;
        int y = size.height;

        int diff = Math.abs(x - preferX) + Math.abs(y - preferY);
        if (diff < minDiff) 
            minDiff = diff;
            index = i;
        
    
    return allSupportSizes.get(index);

【讨论】:

我有自己的自定义相机预览类

以上是关于使用自定义相机的图像质量很差的主要内容,如果未能解决你的问题,请参考以下文章

坏像素化图像 - 自定义 android 相机

质量:自定义 AVFoundation 相机应用程序 VS。 iOS 标准相机应用

使用 Objective C 自定义相机捕捉图像和裁剪

iOS:自定义相机如何始终以正确的方向保存图像?

如何使用自定义相机 API 制作圆形框架布局并捕获圆形图像?

保存自定义相机捕获图像 iOS Xcode