请帮助正确配置Android摄像头(在HTC Desire 2.3.3上测试),以便在旋转(人像)模式下从摄像头预览。预览必须占用屏幕的一半以下,它的宽度必须等于设备的宽度,缩放必须根据相机的纵横比动态设置。我的当前代码:
public class CameraSurface extends SurfaceView implements SurfaceHolder.Callback {
…
public void surfaceCreated(SurfaceHolder holder) {
try {
if (camera != null) {
try {
camera.stopPreview();
} catch (Exception ignore) {
}
try {
camera.release();
} catch (Exception ignore) {
}
camera = null;
}
camera = Camera.open();
camera.setPreviewDisplay(holder);
} catch (Exception ex) {
try {
if (camera != null) {
try {
camera.stopPreview();
} catch (Exception ignore) {
}
try {
camera.release();
} catch (Exception ignore) {
}
camera = null;
}
} catch (Exception ignore) {
}
}
}
public void surfaceDestroyed(SurfaceHolder holder) {
try {
if (camera != null) {
try {
camera.stopPreview();
} catch (Exception ignore) {
}
try {
camera.release();
} catch (Exception ignore) {
}
camera = null;
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
try {
Camera.Parameters parameters = camera.getParameters();
float bff = 0;
try {
List<Camera.Size> supportedSizes = null;
//maximize supported resizes, TODO remove as hardcode
w*=1.5;
h*=1.5;
// On older devices (<1.6) the following will fail
// the camera will work nevertheless
supportedSizes = Compatibility.getSupportedPreviewSizes(parameters);
// preview form factor
float ff = (float) w / h;
Log.d("TAG", "Screen res: w:" + w + " h:" + h
+ " aspect ratio:" + ff);
// holder for the best form factor and size
int bestw = 0;
int besth = 0;
Iterator<Camera.Size> itr = supportedSizes.iterator();
// we look for the best preview size, it has to be the closest
// to the
// screen form factor
while (itr.hasNext()) {
Camera.Size element = itr.next();
// current form factor
float cff = (float) element.width / element.height;
// check if the current element is a candidate to replace
// the best match so far
// current form factor should be closer to the bff
// preview width should be less than screen width
// preview width should be more than current bestw
// this combination will ensure that the highest resolution
// will win
Log.d("TAG", "Candidate camera element: w:"
+ element.width + " h:" + element.height
+ " aspect ratio:" + cff);
if ((ff - cff <= ff - bff) && (element.width <= w)
&& (element.width >= bestw)) {
bff = cff;
bestw = element.width;
besth = element.height;
}
}
Log.d("TAG", "Chosen camera element: w:" + bestw + " h:"
+ besth + " aspect ratio:" + bff);
// Some Samsung phones will end up with bestw and besth = 0
// because their minimum preview size is bigger then the screen
// size.
// In this case, we use the default values: 480x320
if ((bestw == 0) || (besth == 0)) {
Log.d("Mixare", "Using default camera parameters!");
bestw = 480;
besth = 320;
}
parameters.setPreviewSize(bestw,besth);
} catch (Exception ex) {
parameters.setPreviewSize(480,320);
bff=1.5f;
}
makeResizeForCameraAspect(bff);
camera.setDisplayOrientation(90);//only Android 2.2 and later
camera.setParameters(parameters);
camera.startPreview();
} catch (Exception ex) {
Log.e(TAG,"",ex);
}
}
private void makeResizeForCameraAspect(float cameraAspectRatio){
LayoutParams layoutParams=this.getLayoutParams();
int matchParentWidth=this.getWidth();
int newHeight=(int)(matchParentWidth/cameraAspectRatio);
if(newHeight!=layoutParams.height){
layoutParams.height=newHeight;
layoutParams.width=matchParentWidth;
this.setLayoutParams(layoutParams);
this.invalidate();
}
}
}
活动布局:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<org.mixare.CameraSurface
android:id="@+id/camera_surface"
android:layout_width="match_parent"
android:layout_height="150dp"
android:layout_alignParentTop="true"
/>
<!--CameraSurface layout_height will be changed during it's loading process -->
</RelativeLayout>
AndroidManifest配置为肖像:
<activity android:label="@string/app_name" android:name=".MixView"
android:screenOrientation="portrait"
android:launchMode="singleTop" >
你可以看到图像的比例不对。如何使以适当的比例显示旋转和缩放相机预览?
部分代码取自Mixare开源项目,http://www.Mixare.org/
我知道我已经来不及回答这个问题了,但是这个问题可以通过将相机的显示方向设置为90度来解决,即在CameraSurface
类的SurfaceCreated
方法中的camera.Open()
后面添加以下一行
Camera.SetDisplayOrientation(90);
希望这能帮助其他有同样问题的人。
我一直在努力在Android上制作我的自定义相机活动,但当旋转相机时,表面视图的纵横比会变得混乱。 在我的oncreate for the activity中,我设置了framelayout,它保存了显示相机参数的曲面视图。 然后,在曲面视图中,我设置要显示的相机参数 您可以看到,当手机旋转时,乐高男会变得更高、更瘦: 如何确保相机视图的纵横比正确?
我使用相机仅显示预览(不拍照或录制视频)。 该应用程序始终处于竖屏状态(横向模式被禁用)。相机预览始终旋转90度ccw,我无法更改它(无论是还是和。 预览总是这样旋转还是依赖于设备?如果在纵向模式下总是这样,我可以在之后旋转图像。 或者有没有办法正确设置摄像头?我读了很多关于这个的帖子,但没有一个答案对我有用(Galaxy s2,Android v2.3)
有没有人使用过这个打包的Xamrin版本?https://components.xamarin.com/view/emgucv-v3 我最近购买了这个许可证,并击中了与这里描述的完全相同的问题(旋转相机预览到肖像Android OpenCV相机)。一直在使用各种方法。 首先转屏方向从风景到肖像,但这只是以相同的旋转形式(90度)显示流。景观似乎是唯一一个我喜欢的作品。 我尝试使用相机对象旋转相机本
null null 当然,任何其他建议都将不胜感激。 注意:也有类似的问题,我花了几个小时来研究,但没有一个正确地解决了我的问题,也没有给出足够的细节。
我正在写一个定制的肖像相机,我在图像方向上有一些问题。具体而言,我需要始终将相机设置为纵向,并使用清单配置: Android:屏幕方向="肖像" 我在应用程序中设置: 这是有效的,因为当我旋转设备(90,180,270度)时,我可以看到(从相机预览)正确的图像。 我不在乎设备方向何时被锁定(禁用),但当它启用时,我似乎没有得到任何方向更改。我总是使用代码获得0度: 从技术上讲,我需要写入拍摄的照片
当我捕获照片时,在某些设备中,它会以景观模式存储在某些设备中,它会存储肖像。我想让图像在肖像模式无论如何。为此,我尝试获取图像的数据,并相应地将其旋转到肖像模式。但在一些设备,如三星,VIVO的方向值得到“0”。我不知道该怎么处理那个值。如果我90,那么一些设备将解决此问题,而另一些设备将向上保存照片。 我从Xamarin那里得到这个主意。Andoid图像旋转。但不知怎的,我不能再继续下去了。会有