我正在尝试控制Android相机在肖像应用程序中拍照,但是当我保存图片时,它是在风景中.我用setCameraDisplayOrientation()方法将图像旋转了90个等级 ,但是不起作用.
然后我发现这个职位,但TAG_ORIENTATIONIS 0(不确定).如果我捕获此值并应用旋转值,则也不起作用.
我如何拍摄肖像并以良好的方向保存?
/** Initializes the back/front camera */
private boolean initPhotoCamera() {
try {
camera = getCameraInstance(selected_camera);
Camera.Parameters parameters = camera.getParameters();
// parameters.setPreviewSize(width_video, height_video);
// parameters.set("orientation", "portrait");
// parameters.set("rotation", 1);
// camera.setParameters(parameters);
checkCameraFlash(parameters);
// camera.setDisplayOrientation( 0);
setCameraDisplayOrientation(selected_camera, camera);
surface_view.getHolder().setFixedSize(width_video, height_video);
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(width_video, height_video);
surface_view.setLayoutParams(lp);
camera.lock();
surface_holder = surface_view.getHolder();
surface_holder.addCallback(this);
surface_holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
setPreviewCamera();
} catch (Exception e) {
Log.v("RecordVideo", "Could not initialize the Camera");
return false;
}
return true; …Run Code Online (Sandbox Code Playgroud) 根据该文件,setRotation(90)应旋转拍摄的JPEG图片(takePicture在横向模式.
这在HTC手机上运行良好,但在三星Google Nexus S和三星Galaxy S3上无效.这是一个错误吗?
我知道我可以使用矩阵变换旋转,但希望操作系统可以更有效地执行此操作,并且不希望在某些其他设备上存在过度旋转的风险.
编辑
设置camera.setDisplayOrientation(90);使预览处于纵向模式,但它对拍摄的照片没有任何影响.
此外,另外setRotation,我也试图设置图片大小-在我翻转h用w:parameters.setPictureSize(1200, 1600);.这也没有任何影响.
解
显然,三星手机设置了EXIF方向标签,而不是旋转单个像素.如ariefbayu建议的那样,使用Bitmap BitmapFactory不支持此标记.他的代码示例是解决方案,此解决方案也与使用兼容inSampleSize.
我试图创建一个简单的相机应用程序进行研究.我阅读Android Camera Official Document然后开始编码.所以我做了一些步骤让它发挥作用
1.在应用中添加了相机功能所需的权限.
2.我的活动仅限于PORTRAIT模式.
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
3.增加了几个相机回调以使我的相机工作.
4.In surfaceChanged方法,我自定义相机设置.到目前为止,我已经为几乎所有Android设备工作了
但随后我在Android版2.3.6的三星Galaxy ACE上进行了测试,发现Camera Display Preview已转为横向模式.
因此,在记录了log-cat/break点后,我发现下面的方法对于这个特定的模型不起作用
//This method is not working for Samsung Galaxy ACE
camera.setDisplayOrientation(90);
//or
parameters.set("orientation", "portrait");
//or
parameters.setRotation(90);
Run Code Online (Sandbox Code Playgroud)
注意: 我在Google和SO上搜索了大量解决方案,但到目前为止还没有任何运气
供您参考我的示例代码如下
@Override
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
Log.v(TAG, "surfaceChanged get called"); …Run Code Online (Sandbox Code Playgroud)