首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >摄像机预览失真

摄像机预览失真
EN

Stack Overflow用户
提问于 2014-04-26 16:46:37
回答 3查看 1.1K关注 0票数 0

我对照相机有一些问题。我在小米Mi2a上测试了我的代码,预览被扭曲了。我在manifest中有这一行:android:screenOrientation="portrait"我将相机与这段代码一起使用:

代码语言:javascript
运行
复制
import android.app.Fragment;
import android.content.res.Configuration;
import android.hardware.Camera;
import android.os.Bundle;
import android.view.*;
import android.widget.

import java.io.IOException;
import java.util.List;


public class CameraFragment extends Fragment implements SurfaceHolder.Callback,       Camera.PictureCallback, Camera.PreviewCallback, Camera.AutoFocusCallback,   View.OnClickListener {

private Camera mCamera;
private SurfaceHolder mSurfaceHolder;
private SurfaceView mPreview;
private ImageButton mTakePicture;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.camera_fragment, container, false);

    mPreview = (SurfaceView) v.findViewById(R.id.svCameraView);

    mSurfaceHolder = mPreview.getHolder();
    mSurfaceHolder.addCallback(this);
    mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

    mTakePicture = (ImageButton) v.findViewById(R.id.ibTakePicture);
    mTakePicture.setOnClickListener(takePictureOnClickListener);

    ImageButton switchCameraButton = (ImageButton) v.findViewById(R.id.ibSwitchCamera);
    switchCameraButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

        }
    });

    return v;
}

View.OnClickListener takePictureOnClickListener = new View.OnClickListener() {
    @Override
    public void onClick(View view) {

    }
};


@Override
public void onResume() {
    super.onResume();
    mCamera = Camera.open();
}

@Override
public void onPause() {
    super.onPause();

    if (mCamera != null) {
        mCamera.setPreviewCallback(null);
        mCamera.stopPreview();
        mCamera.release();
        mCamera = null;
    }
}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}

@Override
public void surfaceCreated(SurfaceHolder holder) {
    try {
        mCamera.setPreviewDisplay(holder);
        mCamera.setPreviewCallback(this);
    } catch (IOException e) {
        e.printStackTrace();
        return;
    }

    Camera.Parameters parameters = mCamera.getParameters();

    List<String> flashModes = parameters.getSupportedFlashModes();
    /*if (flashModes != null && flashModes.contains(Camera.Parameters.FLASH_MODE_OFF))
        parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);*/

    List<String> whiteBalance = parameters.getSupportedWhiteBalance();
    if (whiteBalance != null && whiteBalance.contains(Camera.Parameters.WHITE_BALANCE_AUTO))
        parameters.setWhiteBalance(Camera.Parameters.WHITE_BALANCE_AUTO);

    List<String> focusModes = parameters.getSupportedFocusModes();
    if (focusModes != null && focusModes.contains(Camera.Parameters.FOCUS_MODE_AUTO))
        parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);

    List<Camera.Size> sizes = parameters.getSupportedPictureSizes();
    /*if (sizes != null && sizes.size() > 0) {
        Camera.Size size = sizes.get(0);
        parameters.setPictureSize(size.width, size.height);
    }*/

    List<Camera.Size> previewSizes = parameters.getSupportedPreviewSizes();
    /*if (previewSizes != null) {
        Camera.Size previewSize = previewSizes.get(previewSizes.size() - 1);
        parameters.setPreviewSize(previewSize.width, previewSize.height);
    }*/

    Camera.Size previewSize = mCamera.getParameters().getPreviewSize();
    float aspect = (float) previewSize.width / previewSize.height;

    int previewSurfaceWidth = mPreview.getWidth();
    int previewSurfaceHeight = mPreview.getHeight();

    ViewGroup.LayoutParams lp = mPreview.getLayoutParams();

    if (this.getResources().getConfiguration().orientation != Configuration.ORIENTATION_LANDSCAPE) {
        mCamera.setDisplayOrientation(90);
        lp.height = previewSurfaceHeight;
        lp.width = (int) (previewSurfaceHeight / aspect);
    } else {
        mCamera.setDisplayOrientation(0);
        lp.width = previewSurfaceWidth;
        lp.height = (int) (previewSurfaceWidth / aspect);
    }

    mPreview.setLayoutParams(lp);
    mCamera.setParameters(parameters);
    mCamera.startPreview();
}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
}

@Override
public void onClick(View v) {
    if (v == mTakePicture) {

        //mCamera.takePicture(null, null, null, this);
        mCamera.autoFocus(this);
    }
}

@Override
public void onPictureTaken(byte[] paramArrayOfByte, Camera paramCamera) {
    paramCamera.startPreview();
}

@Override
public void onAutoFocus(boolean paramBoolean, Camera paramCamera) {
    if (paramBoolean) {
        paramCamera.takePicture(null, null, null, this);
    }
}

@Override
public void onPreviewFrame(byte[] paramArrayOfByte, Camera paramCamera) {
}

我不知道结果图像如何,因为我现在不需要它。但是预览被扭曲了。例如:

http://habrastorage.org/files/fc5/cd1/6fb/fc5cd16fb80f41f6ac7a8a800e0348b6.png http://habrastorage.org/files/968/cd4/850/968cd48505564f93b0258a07fe48a545.png

我做错了什么?如何保持预览在正常状态,而不是拉伸?或者,可能是miui有问题?

EN

Stack Overflow用户

发布于 2014-04-28 15:12:14

代码语言:javascript
运行
复制
 Take Video Size or Picture Size Available on Device
check in preview constructor-
    List<Camera.Size> sizes = mCamera.getParameters()
                    .getSupportedVideoSizes();
            if (sizes != null)
                for (Camera.Size size : sizes) {

                    int h = size.height;
                    int w = size.width;
                    System.out.println("h=" + h + " w=" + w);

                }
then decide what resolution you want for you requirment then make frame layout of same resoultion

abc.xml file
      <FrameLayout
                    android:id="@+id/camera_preview"
                    android:layout_width="288dp"
                    android:layout_height="352dp"
                    android:layout_gravity="center_horizontal"
                    android:layout_marginTop="10dp"
                    >
            </FrameLayout>

preview in surface created-
if(mCamera!=null)
             {
             Parameters params=mCamera.getParameters();
             params.setPictureSize(288, 352);
             mCamera.setParameters(params);
             }

please make change according to your need if you need any help then ask.
票数 0
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23308674

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档