private int setCameraDisplayOrientation(Activity mContext, int v)
{
var degrees = 0;
var orientation =0;
Display display = mContext.GetSystemService(Context.WindowService).JavaCast<IWindowManager>().DefaultDisplay;
Camera.CameraInfo info = new Camera.CameraInfo();
Camera.GetCameraInfo(v, info);
var rotation = windowManager.DefaultDisplay.Rotation;
DisplayMetrics dm = new DisplayMetrics();
display.GetMetrics(dm);
int width = dm.WidthPixels;
int height = dm.HeightPixels;
//Natural orientation is portrait
if ((rotation == SurfaceOrientation.Rotation0 || rotation == SurfaceOrientation.Rotation180) && height > width ||
(rotation == SurfaceOrientation.Rotation90 || rotation == SurfaceOrientation.Rotation270) && width > height)
{
switch (rotation)
{
case SurfaceOrientation.Rotation0:
degrees = 90;
break;
case SurfaceOrientation.Rotation90:
degrees = 0;
break;
case SurfaceOrientation.Rotation180:
degrees = 270;
break;
case SurfaceOrientation.Rotation270:
degrees = 180;
break;
}
}
return (degrees);
}
当我捕获照片时,在某些设备中,它会以景观模式存储在某些设备中,它会存储肖像。我想让图像在肖像模式无论如何。为此,我尝试获取图像的exif
数据,并相应地将其旋转到肖像模式。但在一些设备,如三星,VIVO的方向值得到“0”。我不知道该怎么处理那个值。如果我prerotate
90,那么一些设备将解决此问题,而另一些设备将向上保存照片。
**Managing Rotation**
Android.Graphics.Bitmap loadAndResizeBitmap(string filePath)
{
Android.Graphics.Bitmap resizedBitmap = Android.Graphics.BitmapFactory.DecodeFile(filePath);
ExifInterface exif = null;
try
{
exif = new ExifInterface(filePath);
string orientation = exif.GetAttribute(ExifInterface.TagOrientation);
Android.Graphics.Matrix matrix = new Android.Graphics.Matrix();
switch (orientation)
{
case "1":
matrix.PreRotate(-90);
resizedBitmap = Android.Graphics.Bitmap.CreateBitmap(resizedBitmap, 0, 0, resizedBitmap.Width, resizedBitmap.Height, matrix, false);
matrix.Dispose();
matrix = null;
break;
case "3":
matrix.PreRotate(180);
resizedBitmap = Android.Graphics.Bitmap.CreateBitmap(resizedBitmap, 0, 0, resizedBitmap.Width, resizedBitmap.Height, matrix, false);
matrix.Dispose();
matrix = null;
break;
case "4":
matrix.PreRotate(180);
resizedBitmap = Android.Graphics.Bitmap.CreateBitmap(resizedBitmap, 0, 0, resizedBitmap.Width, resizedBitmap.Height, matrix, false);
matrix.Dispose();
matrix = null;
break;
case "5":
matrix.PreRotate(90);
resizedBitmap = Android.Graphics.Bitmap.CreateBitmap(resizedBitmap, 0, 0, resizedBitmap.Width, resizedBitmap.Height, matrix, false);
matrix.Dispose();
matrix = null;
break;
case "6": // portrait
matrix.PreRotate(90);
resizedBitmap = Android.Graphics.Bitmap.CreateBitmap(resizedBitmap, 0, 0, resizedBitmap.Width, resizedBitmap.Height, matrix, false);
matrix.Dispose();
matrix = null;
break;
case "7":
matrix.PreRotate(-90);
resizedBitmap = Android.Graphics.Bitmap.CreateBitmap(resizedBitmap, 0, 0, resizedBitmap.Width, resizedBitmap.Height, matrix, false);
matrix.Dispose();
matrix = null;
break;
case "8":
matrix.PreRotate(-90);
resizedBitmap = Android.Graphics.Bitmap.CreateBitmap(resizedBitmap, 0, 0, resizedBitmap.Width, resizedBitmap.Height, matrix, false);
matrix.Dispose();
matrix = null;
break;
case "0":
matrix.PreRotate(-90);
resizedBitmap = Android.Graphics.Bitmap.CreateBitmap(resizedBitmap, 0, 0, resizedBitmap.Width, resizedBitmap.Height, matrix, false);
matrix.Dispose();
matrix = null;
break;
}
return resizedBitmap;
}
catch (IOException ex)
{
return null;
}
}
我从Xamarin那里得到这个主意。Andoid图像旋转。但不知怎的,我不能再继续下去了。会有什么问题?我应该传递流而不是文件路径吗?是由于表面视图旋转造成的吗?我如何在任何设备上无论什么都能让捕捉到的图像成为人像?感谢任何帮助。
仅针对Xamarin.android,使用依赖服务在共享项目中调用
由此得到图像的旋转角度。
public int GetImageRotation(string filePath)
{
try
{
ExifInterface ei = new ExifInterface(filePath);
Orientation orientation = (Orientation)ei.GetAttributeInt(ExifInterface.TagOrientation, (int)Orientation.Undefined);
switch (orientation)
{
case Orientation.Rotate90:
return 90;
case Orientation.Rotate180:
return 180;
case Orientation.Rotate270:
return 270;
default:
return 0;
}
}
catch(Exception ex)
{
return 0;
}
}
现在根据你得到的角度值旋转图像。
public byte[] RotateImage(System.IO.Stream imageStream, string filePath)
{
int rotationDegrees = GetImageRotation(filePath)
byte[] byteArray = new byte[imageStream.Length];
try
{
imageStream.Read(byteArray, 0, (int)imageStream.Length);
Bitmap originalImage = BitmapFactory.DecodeByteArray(byteArray, 0, byteArray.Length);
Matrix matrix = new Matrix();
matrix.PostRotate((float)rotationDegrees);
Bitmap rotatedBitmap = Bitmap.CreateBitmap(originalImage, 0, 0, originalImage.Width,
originalImage.Height, matrix, true);
using (MemoryStream ms = new MemoryStream())
{
rotatedBitmap.Compress(Bitmap.CompressFormat.Jpeg, 100, ms);
return ms.ToArray();
}
}
catch(Exception ex)
{
return byteArray;
}
}
我试图做一个简单的应用程序,使用系统相机应用程序来拍照。我已经在android版本6中测试了我的应用程序,我的应用程序成功打开了设备的摄像头。但在一些android v6设备(如三星Galaxy A3)中,我遇到了以下安全异常: 我已经在我的代码中添加了权限检查: 稍后我称之为捕获图像: 从日志中,我看到captureImage第203行调用了startActivityForResult。既然我已
我发现了一个非常有趣的问题。在拍摄相机照片后(我将设备保持在纵向模式,不旋转),给定的照片有时会旋转,但并不总是旋转。我知道,有些设备总是提供旋转的照片,但它可以使用exif或mediastore信息进行旋转。但在这种情况下,exif和mediastore表示方向为0,但图像是旋转的。最令人沮丧的是,这完全是随机发生的。代码非常简单: 有人见过这个问题吗?我在操作系统更新(4.1.1)后体验了Ga
我已经被困在相机里6天了,但没有得到任何适当的解决方案。当我通过相机意图捕获图像时,图像正在旋转。我试图修复方向,但有时它没有在onActivityResult()中给出位图值。当我尝试在ImageView中设置图像时,它会显示一个黑色屏幕。这是我的密码请帮帮我- 我得到的图像在横向模式,但不是在potrait模式。相机预览在拍摄图像后自动旋转90度。
在我的应用程序中,用户从相机捕获图像或从图库中选择图像,然后将其转换为pdf并上载到服务器,现在我的问题是,从相机捕获的图像在某些设备上旋转,我有代码尝试解决此问题,但它不起作用 任何建议或问题在哪里,没有错误代码或任何东西
有没有人使用过这个打包的Xamrin版本?https://components.xamarin.com/view/emgucv-v3 我最近购买了这个许可证,并击中了与这里描述的完全相同的问题(旋转相机预览到肖像Android OpenCV相机)。一直在使用各种方法。 首先转屏方向从风景到肖像,但这只是以相同的旋转形式(90度)显示流。景观似乎是唯一一个我喜欢的作品。 我尝试使用相机对象旋转相机本
Camera元素一个关键特性就是可以用来拍照。我们将在一个简单的定格动画程序中使用到它。在这章中,你将学习如何显示一个视图查找器,截图和追踪拍摄的图片。 用户界面如下所示。它由三部分组成,背景是一个视图查找器,右边有一列按钮,底部有一连串拍摄的图片。我们想要拍摄一系列的图片,然后点击Play Sequence按钮。这将回放图片,并创建一个简单的定格电影。 相机的视图查找器部分是在VideoOutp