根据该文件,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
.
我正在尝试使用OpenCV 2.4.3.2创建一个相机应用程序并进行一些opencv处理.我希望它能够有多个UI方向,而不仅仅是Landscape.
问题是,当我将方向更改为纵向时,图像会侧向出现.
我知道我可以在进行图像处理之前旋转输入图像(因此只将方向保留为横向),这很好并且有效,但是没有解决我的其他UI将处于错误方向的问题.
我也尝试使用这段代码来旋转相机90deg,但它似乎没有用.
mCamera.setDisplayOrientation(90);
Run Code Online (Sandbox Code Playgroud)
它要么没有效果,要么有时只会导致预览变黑
有人用OpenCV成功完成了这项工作吗?我的类扩展自JavaCameraView.
我做了一些改进,就是我在OpenCV中旋转了图像,因为它在CameraBridgeViewBase.java类中显示.
在交付和绘制框架方法中:
if (canvas != null) {
canvas.drawColor(0, android.graphics.PorterDuff.Mode.CLEAR);
//canvas.drawBitmap(mCacheBitmap, (canvas.getWidth() - mCacheBitmap.getWidth()) / 2, (canvas.getHeight() - mCacheBitmap.getHeight()) / 2, null);
//Change to support portrait view
Matrix matrix = new Matrix();
matrix.preTranslate((canvas.getWidth() - mCacheBitmap.getWidth()) / 2,(canvas.getHeight() - mCacheBitmap.getHeight()) / 2);
if(getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT)
matrix.postRotate(90f,(canvas.getWidth()) / 2,(canvas.getHeight()) / 2);
canvas.drawBitmap(mCacheBitmap, matrix, new Paint());
Run Code Online (Sandbox Code Playgroud)
...基本上,这只是像输入图像一样
这样更好,但我显然希望这是全屏.
我试图创建一个简单的相机应用程序进行研究.我阅读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) 我根据教程创建了一个相机应用程序.我使用的预览类来自api-Demos"CameraPreview".我从这里添加了一个修改(预览总是旋转90°).这就是我设置预览大小的方法:
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
// Now that the size is known, set up the camera parameters and begin
// the preview.
Camera.Parameters parameters = mCamera.getParameters();
Display display = ((WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
if (display.getRotation() == Surface.ROTATION_0) {
parameters.setPreviewSize(mPreviewSize.height, mPreviewSize.width);
mCamera.setDisplayOrientation(90);
}
if (display.getRotation() == Surface.ROTATION_90) {
parameters.setPreviewSize(mPreviewSize.width, mPreviewSize.height);
}
if (display.getRotation() == Surface.ROTATION_180) {
parameters.setPreviewSize(mPreviewSize.height, mPreviewSize.width);
}
if (display.getRotation() == Surface.ROTATION_270) {
parameters.setPreviewSize(mPreviewSize.width, mPreviewSize.height);
mCamera.setDisplayOrientation(180);
}
parameters.setPreviewSize(mPreviewSize.width, mPreviewSize.height);
requestLayout();
mCamera.setParameters(parameters);
mCamera.startPreview();
} …
Run Code Online (Sandbox Code Playgroud) 我创建了一个相机应用程序,我希望我的应用程序可以在所有4种可能的方向上转动,并相应地更新相机预览.因为我使用了以下我复制过的方法: Android - 相机预览是横向的
public void updateCameraDisplay(int w, int h) {
// set preview size and make any resize, rotate or
// reformatting changes here
Log.i("CameraPreviews", "Updating camera orientation with w=" + w
+ " and h=" + h);
Parameters parameters = camera.getParameters();
Display display = getActivity().getWindowManager()
.getDefaultDisplay();
int rotation = getActivity().getResources().getConfiguration().orientation;
Log.i("CameraPreviews", "rotation is " + display.getRotation());
if (display.getRotation() == Surface.ROTATION_0) {
parameters.setPreviewSize(h, w);
camera.setDisplayOrientation(0);
}
if (display.getRotation() == Surface.ROTATION_90) {
parameters.setPreviewSize(w, h);
camera.setDisplayOrientation(270);
}
if (display.getRotation() == Surface.ROTATION_180) …
Run Code Online (Sandbox Code Playgroud) 以垂直格式拍摄的照片以横向格式保存,反之亦然.我使用这个意图使用Android相机
Intent captureImage = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
captureImage.putExtra(MediaStore.EXTRA_OUTPUT, imageFileUri);
startActivityForResult(captureImage, CAMERA_PIC_REQUEST);
Run Code Online (Sandbox Code Playgroud)
onActivityResult()我只是将图像URL保存到我的数据库并在列表视图中显示它.但是有了方向性的变化.如果我从图库中选择图像并保存它,也会发生同样的情况.
我想要拍摄照片的方向.我不想改变它.有没有人对此有解决方法.
我正在尝试(再次)创建实际上正常工作的相机预览逻辑,适用于所有场景:
android.hardware.Camera
和 android.hardware.camera2
因为我minSdkVersion
15岁,因为我并不特别关心表现,所以我试图用一个TextureView
.并且,根据fadden在这里和这里的地方的建议,我试图setTransform()
在TextureView
适当的情况下使用Matrix
它:
TextureView
完全填充,以TextureView
纵横比与预览帧宽高比不匹配的裁剪为代价在我的情况下,TextureView
填充屏幕,减去状态栏和导航栏.
adjustAspectRatio()
从GrafikaPlayMovieActivity.java
开始,我现在有:
private void adjustAspectRatio(int videoWidth, int videoHeight,
int rotation) {
if (iCanHazPhone) {
int temp=videoWidth;
videoWidth=videoHeight;
videoHeight=temp;
}
int viewWidth=getWidth();
int viewHeight=getHeight();
double aspectRatio=(double)videoHeight/(double)videoWidth;
int newWidth, newHeight;
if (getHeight()>(int)(viewWidth*aspectRatio)) {
newWidth=(int)(viewHeight/aspectRatio);
newHeight=viewHeight;
}
else {
newWidth=viewWidth;
newHeight=(int)(viewWidth*aspectRatio);
}
int xoff=(viewWidth-newWidth)/2;
int yoff=(viewHeight-newHeight)/2;
Matrix …
Run Code Online (Sandbox Code Playgroud) 我的相机应用程序有问题.相机活动处于纵向模式.所以我给了
camera.setDisplayOrientation(90);
Run Code Online (Sandbox Code Playgroud)
根据SO中的不同帖子,这将在纵向模式下正常工作.
但它不能正常使用不同的设备.问题是,预览向左或向右旋转90度.在Htc中没关系.但是对于Galaxy系列,它不起作用.
谁能帮我 ?
我试图将相机放在Android手机上的纵向SurfaceView中.我使用http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/CameraPreview.html将相机放入surfaceView.然而,相机旋转90度,所以我尝试使用setDisplayOrientation(90)来修复它,但这会压缩图像(它可能没有正确调整SurfaceView的大小?).我该怎么做才能让相机不被挤压?
是否可以仅在纵向模式下在Android中打开Camera Intent,即使用户翻转设备,相机仍将处于纵向模式,
我尝试了以下答案:强制人像模式,但没有工作,谢谢
你好朋友.我正在创建一个使用相机代码的Android应用程序.我用过android-API 2.1.我在戴尔手机上安装了我的应用程序,相机的方向是正确的.但是,我在三星Galaxy S2等其他Android手机中安装了我的应用程序.这里,问题在于相机方向,即使在纵向模式下相机旋转90度.任何人都可以建议我是否需要更改任何相机参数,以便相机方向适用于所有手机...?这是我的代码:
//class CameraDemo
public class CameraDemo extends Activity {
private static final String TAG = "CameraDemo";
Camera camera;
Preview preview;
Button buttonClick;
Button next;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
try
{
super.onCreate(savedInstanceState);
setContentView(R.layout.camdemo);
preview = new Preview(this);
((FrameLayout) findViewById(R.id.preview)).addView(preview);
buttonClick = (Button) findViewById(R.id.buttonClick);
next = (Button) findViewById(R.id.next);
buttonClick.setOnClickListener( new OnClickListener() {
public void onClick(View v) {
preview.camera.takePicture(shutterCallback, rawCallback, jpegCallback);
try{
Constants.takepic=1;
buttonClick.setEnabled(false); //once click is clicked, its disable …
Run Code Online (Sandbox Code Playgroud) 这个问题类似于这里,这里,这里,这里和这里的帖子,但我被困住了,花了好几个小时试图解决它.
我有一个摄像机预览(现在总是以正确的方向显示),但是当我点击记录(mediaRecorder.start();)时,视频方向会改变.我尝试过使用setOrientationHint,但它似乎没有什么区别(如下面代码中的注释所标记).
它会影响我的测试设备(Galaxy和Jelly Bean上的Xperia).我该怎么做才能解决这个问题?
这是我的代码:
XML
<RelativeLayout android:id="@+id/surface_camera"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_centerInParent="true"
android:layout_weight="1"
>
<RelativeLayout
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<FrameLayout
android:id="@+id/videoview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"/>
<Button
android:id="@+id/mybutton"
android:layout_width="100dp"
android:layout_height="50dp"
android:layout_centerHorizontal="true"
android:layout_alignParentBottom="true"
android:text="REC"
android:textSize="12dp"/>
</RelativeLayout>
</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)
Java的
package hockeyj.androidlisttesting;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import android.app.Activity;
import android.content.Context;
import android.hardware.Camera;
import android.media.CamcorderProfile;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.view.Display;
import android.view.Surface;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button; …
Run Code Online (Sandbox Code Playgroud) 我以这种方式采用mRGBA下的当前帧:
mRgba = inputFrame.rgba();
Run Code Online (Sandbox Code Playgroud)
然后创建一个矩形对象,它取当前相机框架的高度和宽度
rect = new Rect();
rect.width = mRgba.width();
rect.height = mRgba.height();
Run Code Online (Sandbox Code Playgroud)
它需要整个框架的空间,但当我试图收缩这个矩形时,它在一侧收缩(不是我需要的整体)
所以我试图找到矩形中心,然后尝试根据该中心和预定义的大小创建另一个矩形
int x = (int) (rect.tl().x + rect.br().x)/2;
int y = (int) (rect.tl().y + rect.br().y)/2;
Rect rect1 = new Rect(x,y,280,280);
Imgproc.rectangle(mRgba, rect1.tl(), rect1.br(), new Scalar(255, 0, 0), 2, 8, 0);
Run Code Online (Sandbox Code Playgroud)
但它不在中心!! 我不确定矩形对象采取的参数我没有找到opencv的文件非常有用.那么如何克服这种情况我希望矩形正好位于相机框架的中心.