使用Camera预览显示变形问题

昵__称 2015-01-12 06:16:19
我使用Camera显示预览图竖屏显示会有一些拉伸。感觉被拉长了。
我已经选择了最接近的比例了,但是还是有拉伸。
package com.example.zxing_android;

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

import com.example.zxing_android.R.color;

import android.app.Activity;
import android.hardware.Camera;
import android.hardware.Camera.Size;
import android.os.Bundle;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.LinearLayout.LayoutParams;


/**
*/
public class CameraActivity extends Activity {
SurfaceView mSurface;
SurfaceHolder mSurfaceHolder;
Camera mCamera;
boolean isInit;
Button btn;

// int viewWidth, viewHeight;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_camera);
mSurface = (SurfaceView) findViewById(R.id.camera);
btn = (Button) findViewById(R.id.btn);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
mCamera.autoFocus(null);// 自动对焦
}
});
mSurfaceHolder = mSurface.getHolder(); // get the camera holder
mSurfaceHolder.addCallback(new Callback() {
@Override
public void surfaceCreated(SurfaceHolder arg0) {
mCamera = Camera.open(); // open camera
isInit = false;
try {
mCamera.setPreviewDisplay(mSurfaceHolder); // set the //
} catch (IOException e) {
e.printStackTrace();
if (mCamera != null) {
mCamera.release();
mCamera = null;
}
}
mCamera.startPreview(); // state preview
}

@Override
public void surfaceDestroyed(SurfaceHolder arg0) {
// mSurface.setLayoutParams(new LayoutParams(viewWidth,
// viewHeight));
mCamera.setPreviewCallback(null); // !!这个必须在前,不然退出出错
mCamera.stopPreview();
mCamera.release();
mCamera = null;
}

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

private void initCamera(int width, int height) {
if (!isInit) {
// viewWidth = width;
// viewHeight = height;
isInit = true;
mCamera.autoFocus(null);
Camera.Parameters parameters = mCamera.getParameters();
// 摄像头旋转
// if (android.os.Build.VERSION_CODES.GINGERBREAD >
// android.os.Build.VERSION.SDK_INT) {
mCamera.setDisplayOrientation(90);
// } else {
// parameters.set("rotation", 180);
// }
List<Size> previewSizes = mCamera.getParameters().getSupportedPreviewSizes();
double aspectTolerance = Double.MAX_VALUE;
int preWidth = 0, preHeight = 0;
double scale = ((double) width) / height;
for (int i = 0, len = previewSizes.size(); i < len; i++) {
Size s = previewSizes.get(i);
double sizeScale = ((double) s.height) / s.width;
if (Math.abs(scale - sizeScale) < aspectTolerance) {
aspectTolerance = Math.abs(scale - sizeScale);
preWidth = s.height;
preHeight = s.width;
}
}
if (preWidth != 0) {
parameters.setPreviewSize(preWidth, preHeight);
// mSurface.setLayoutParams(new LayoutParams(720, 1280));
Size s = parameters.getPreviewSize();
Log.e("", s.width + " " + s.height);
}
}
}
}
...全文
794 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
微想未来 2016-10-31
  • 打赏
  • 举报
回复
引用 2 楼 u014387289 的回复:
[quote=引用 1 楼 inquisitive_plus 的回复:] 输出下getSupportedPreviewSizes的所有值。例如1080*720 如果你竖屏是用整个手机屏幕显示预览,那么手机的长宽比例和预览返回的相差太多了。拉伸应该是不可避免。 不想拉伸的话就缩小屏幕显示的范围吧。
比例里面有个480*800的比例,我写死控件高宽在480*700看起来才比较正常。有没有什么办法让控件里面的图像居中呢?[/quote] 为森么系统相机竖屏全屏拍照图像不会变形呢?
「已注销」 2016-08-08
  • 打赏
  • 举报
回复
现在很多Android厂家都对系统进行了深度定制 原生Android是默认Camera开启是默认旋转的 但有些手机给改了 所以就出现了拉伸 或者 观看放拉伸 旋转等问题 这块的适配不好弄 我现在就在搞这个东西
沐沐坏小孩 2015-01-13
  • 打赏
  • 举报
回复
引用 二Y 的回复:
应该先设置预览参数再打开预览图。
windfury_plus 2015-01-13
  • 打赏
  • 举报
回复
用gravity设置。android:gravity="center"或者代码的myLP.gravity=Gravity.CENTER;
昵__称 2015-01-13
  • 打赏
  • 举报
回复
引用 1 楼 inquisitive_plus 的回复:
输出下getSupportedPreviewSizes的所有值。例如1080*720 如果你竖屏是用整个手机屏幕显示预览,那么手机的长宽比例和预览返回的相差太多了。拉伸应该是不可避免。 不想拉伸的话就缩小屏幕显示的范围吧。
比例里面有个480*800的比例,我写死控件高宽在480*700看起来才比较正常。有没有什么办法让控件里面的图像居中呢?
windfury_plus 2015-01-12
  • 打赏
  • 举报
回复
输出下getSupportedPreviewSizes的所有值。例如1080*720 如果你竖屏是用整个手机屏幕显示预览,那么手机的长宽比例和预览返回的相差太多了。拉伸应该是不可避免。 不想拉伸的话就缩小屏幕显示的范围吧。

80,471

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧