Android 安卓定制相机的图像失真
我想让android定制相机处于纵向模式。我已经做了所有的事情,但现在我的主要问题是我的图像被相机扭曲。我检查了之前发布的所有解决方案,但没有任何帮助。你能帮我吗。我的相机预览课程是:-Android 安卓定制相机的图像失真,android,Android,我想让android定制相机处于纵向模式。我已经做了所有的事情,但现在我的主要问题是我的图像被相机扭曲。我检查了之前发布的所有解决方案,但没有任何帮助。你能帮我吗。我的相机预览课程是:- public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback { private SurfaceHolder mSurfaceHolder; private Camera mCam
public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback
{
private SurfaceHolder mSurfaceHolder;
private Camera mCamera;
//Constructor that obtains context and camera
public CameraPreview(Context context, Camera camera) {
super(context);
this.mCamera = camera;
this.mSurfaceHolder = this.getHolder();
this.mSurfaceHolder.addCallback(this); // we get notified when underlying surface is created and destroyed
this.mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); //this is a deprecated method, is not requierd after 3.0
}
@Override
public void surfaceCreated(SurfaceHolder surfaceHolder) {
try {
mCamera.setPreviewDisplay(surfaceHolder);
mCamera.startPreview();
} catch (IOException e) {
// left blank for now
}
}
@Override
public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
mCamera.stopPreview();
mCamera.release();
}
@Override
public void surfaceChanged(SurfaceHolder surfaceHolder, int format,
int width, int height) {
// start preview with new settings
try {
CameraActivity a=new CameraActivity();
Camera.Parameters parameters = mCamera.getParameters();
parameters.set("zoom", "2.0");
parameters.set("taking-picture-zoom", "20");
Camera.Size size = getBestPreviewSize(width, height,parameters) ;
// Log.w("parameters"," "+ mCamera.getParameters().getSupportedPreviewSizes());
parameters.setPreviewSize(size.width, size.height);
Toast.makeText(getContext(), "width" +size.width, Toast.LENGTH_LONG).show();
Toast.makeText(getContext(), "height" +size.height, Toast.LENGTH_LONG).show();
int displayRotation = a.display.getRotation();
switch (displayRotation) {
case Surface.ROTATION_0:
mCamera.setDisplayOrientation(90);
//Log.w("enter here","aaa");break;
case Surface.ROTATION_90:
// parameters.setPreviewSize(size.width, size.height);
break;
case Surface.ROTATION_180:
// parameters.setPreviewSize(size.height,size.width);
break;
case Surface.ROTATION_270:
//parameters.setPreviewSize(size.width, size.height);
mCamera.setDisplayOrientation(180);
// Log.w("enter here","aaa");
break;
}
mCamera.setPreviewDisplay(surfaceHolder);
mCamera.startPreview();
} catch (Exception e) {
// intentionally left blank for a test
}
}
Camera.Size getBestPreviewSize(int width, int height, Camera.Parameters parameters) {
Camera.Size result=null;
float dr = Float.MAX_VALUE;
float ratio = (float)width/(float)height;
for (Camera.Size size : parameters.getSupportedPreviewSizes()) {
float r = (float)size.width/(float)size.height;
if( Math.abs(r - ratio) < dr && size.width <= width && size.height <= height ) {
dr = Math.abs(r - ratio);
result = size;
}
}
return result;
}
公共类CameraPreview扩展了SurfaceView实现了SurfaceHolder.Callback
{
私人地表持有人;
私人摄像机麦卡梅拉;
//获取上下文和摄影机的构造函数
公共摄像机回顾(上下文、摄像机){
超级(上下文);
this.mCamera=摄像机;
this.mSurfaceHolder=this.getHolder();
this.mSurfaceHolder.addCallback(this);//我们在创建和销毁底层曲面时收到通知
this.mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);//这是一种不推荐使用的方法,在3.0之后不需要
}
@凌驾
已创建的公共空隙表面(表面层表面层){
试一试{
mCamera.setPreviewDisplay(surfaceHolder);
mCamera.startPreview();
}捕获(IOE异常){
//暂时留白
}
}
@凌驾
公共空间表面已覆盖(表面层表面层){
mCamera.stopPreview();
mCamera.release();
}
@凌驾
public void surfaceChanged(SurfaceHolder SurfaceHolder,int格式,
整数宽度,整数高度){
//使用新设置开始预览
试一试{
CameraActivity a=新的CameraActivity();
Camera.Parameters=mCamera.getParameters();
参数设置(“缩放”、“2.0”);
参数设置(“拍照变焦”、“20”);
Camera.Size Size=getBestPreviewSize(宽度、高度、参数);
//Log.w(“参数”,“mCamera.getParameters().getSupportedPreviewSizes());
parameters.setPreviewSize(size.width、size.height);
Toast.makeText(getContext(),“width”+size.width,Toast.LENGTH\u LONG.show();
Toast.makeText(getContext(),“height”+size.height,Toast.LENGTH\u LONG.show();
int displayRotation=a.display.getRotation();
开关(显示旋转){
外壳表面旋转0:
mCamera.setDisplayOrientation(90);
//Log.w(“在此输入”、“aaa”);中断;
外壳表面旋转90度:
//parameters.setPreviewSize(size.width、size.height);
打破
外壳表面旋转180度:
//参数.setPreviewSize(大小、高度、大小、宽度);
打破
外壳表面。旋转_270:
//parameters.setPreviewSize(size.width、size.height);
mCamera.setDisplayOrientation(180);
//Log.w(“在此输入”、“aaa”);
打破
}
mCamera.setPreviewDisplay(surfaceHolder);
mCamera.startPreview();
}捕获(例外e){
//故意留下空白进行测试
}
}
Camera.Size getBestPreviewSize(整数宽度、整数高度、Camera.Parameters){
Camera.Size结果=null;
float dr=float.MAX_值;
浮动比率=(浮动)宽度/(浮动)高度;
对于(Camera.Size:parameters.getSupportedPreviewSizes()){
浮动r=(浮动)大小.宽度/(浮动)大小.高度;
如果(Math.abs(r-ratio)
private Camera.Size getBestPreviewSize(int width, int height)
{
Camera.Size result=null;
Camera.Parameters p = mCamera.getParameters();
for (Camera.Size size : p.getSupportedPreviewSizes()) {
if (size.width<=width && size.height<=height || (size.height <= width && size.width <= height)) {
if (result==null) {
result=size;
} else {
int resultArea=result.width*result.height;
int newArea=size.width*size.height;
if (newArea>resultArea) {
result=size;
}
}
}
}
return result;
}