- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在 onPictureTaken
中发现保存的位图围绕 y 轴镜像并顺时针旋转 90 度,即使相机预览不是。这是在运行 2.3.6 的 Nexus S 上。在我的 Nexus 4 4.2 上运行的相同程序生成的位图围绕 y 轴镜像并顺时针旋转 180 度。
这是我在 onPictureTaken
中运行的代码:
@Override
public void onPictureTaken(final byte[] data, Camera camera) {
Bitmap picture = BitmapFactory.decodeByteArray(data, 0, data.length);
String path = MediaStore.Images.Media.insertImage(getContentResolver(), picture, "name" , "description");
Log.e("tag", "path: " + path); // prints something like "path: content://media/external/images/media/819"
try {
ExifInterface exif = new ExifInterface(path); // prints this error: "04-25 21:28:21.063: E/JHEAD(12201): can't open 'content://media/external/images/media/819'"
int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
Log.e("tag", "exif orientation: " + orientation); // this is outputting orientation unknown
} catch (IOException e) {
e.printStackTrace();
}
}
鉴于我似乎从不同的设备获得不同的结果,任何人都可以告诉我如何纠正这个问题吗?如何检测生成的位图的方向,以便我知道将其逆时针旋转 90 度或 180 度?
[编辑]
我使用我一直在阅读的 ExifInterface 内容添加了一些更多信息,但这些信息似乎并没有成功...
最佳答案
我为此付出了很多努力,我想,我会分享我的解决方案。它在 Motorola Devy、Samsung Xcover 1 和 Samsung XCover 2 上进行了测试。
当我使用自定义相机预览时,解决方案基本上有两个部分。1.照顾相机预览并根据预览设置旋转设备旋转。2. 一旦拍照,即调用'onPictureTaken'回调以正确的角度旋转图片,使其显示预览的内容显示。
private void initPreview(int width, int height) {
if (camera != null && holder.getSurface() != null) {
try {
camera.setPreviewDisplay(holder);
} catch (Throwable t) {
Log.e("PreviewDemo-surfaceCallback",
"Exception in setPreviewDisplay()", t);
Toast.makeText(getContext(), t.getMessage(),
Toast.LENGTH_LONG).show();
}
try {
Camera.Parameters parameters=camera.getParameters();
Camera.Size size=getBestPreviewSize(width, height, parameters);
Camera.Size pictureSize=getSmallestPictureSize(parameters);
Display display = windowManager.getDefaultDisplay();
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.FROYO) { // for 2.1 and before
if (isPortrait(display)) {
parameters.set(CAMERA_PARAM_ORIENTATION, CAMERA_PARAM_PORTRAIT);
} else {
parameters.set(CAMERA_PARAM_ORIENTATION, CAMERA_PARAM_LANDSCAPE);
}
} else { // for 2.2 and later
switch (display.getRotation()) {
case Surface.ROTATION_0: // This is display orientation
if (size.height > size.width) parameters.setPreviewSize(size.height, size.width);
else parameters.setPreviewSize(size.width, size.height);
camera.setDisplayOrientation(90);
break;
case Surface.ROTATION_90:
if (size.height > size.width) parameters.setPreviewSize(size.height, size.width);
else parameters.setPreviewSize(size.width, size.height);
camera.setDisplayOrientation(0);
break;
case Surface.ROTATION_180:
if (size.height > size.width) parameters.setPreviewSize(size.height, size.width);
else parameters.setPreviewSize(size.width, size.height);
camera.setDisplayOrientation(270);
break;
case Surface.ROTATION_270:
if (size.height > size.width) parameters.setPreviewSize(size.height, size.width);
else parameters.setPreviewSize(size.width, size.height);
camera.setDisplayOrientation(180);
break;
}
}
parameters.setPictureSize(pictureSize.width, pictureSize.height);
//parameters.setPictureFormat(ImageFormat.JPEG);
camera.setParameters(parameters);
} catch (Exception e) {
e.printStackTrace();
}
}
}
您的“surfaceChanged”方法,在您的相机预览 (SurfaceView) 中,你应该看起来像这样:
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
stopPreview();
initPreview(w, h);
startPreview();
}
在哪里
停止预览:
private void stopPreview() {
if (camera != null) {
camera.stopPreview();
}
}
开始预览:
private void startPreview() {
if (camera != null) {
camera.startPreview();
}
}
在您的“onPictureTaken”回调中旋转图片,使用以下代码:
Display display = getWindowManager().getDefaultDisplay();
int rotation = 0;
switch (display.getRotation()) {
case Surface.ROTATION_0: // This is display orientation
rotation = 90;
break;
case Surface.ROTATION_90:
rotation = 0;
break;
case Surface.ROTATION_180:
rotation = 270;
break;
case Surface.ROTATION_270:
rotation = 180;
break;
}
Bitmap bitmap = BitmapTools.toBitmap(data);
bitmap = BitmapTools.rotate(bitmap, rotation);
BitmapTools.java
public class BitmapTools {
public static Bitmap toBitmap(byte[] data) {
return BitmapFactory.decodeByteArray(data , 0, data.length);
}
public static Bitmap rotate(Bitmap in, int angle) {
Matrix mat = new Matrix();
mat.postRotate(angle);
return Bitmap.createBitmap(in, 0, 0, in.getWidth(), in.getHeight(), mat, true);
}
}
关于android - 如何在onPictureTaken中旋转和翻转位图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16228654/
我已经实现了使用相机拍照的功能。我不想存储它,而是想做一些简单的图片处理(非常简单的 OCR - 主要是尝试自己处理此类任务的能力),为此我需要将 imageData 转换为 public void
我正在创建自定义相机应用我正在使用 Surfaceview。在我的应用程序中,我拍摄了图片,但它在 Note 4 中完美运行,在小米手机中出现问题,我不知道为什么会发生这种情况。 注4 onPictu
我正在创建一个自定义相机应用程序(它将包含在一个更大的主应用程序中),它使用相机加载 View - 预览和图片库预览 - 因此用户可以拍照或选择一个预先存在的。如果用户确实拍照,我只想显示一个确认对话
我有一个发布到 Google Play 的应用程序,它有时会使用来自后台服务的前置摄像头拍照。现在,我收到用户的投诉,说应用程序的这个特定部分不是很一致,我知道这是真的,因为它通常在我调用 camer
我想实现自己的人脸检测/识别安卓应用。当相机发现一些人脸时,一个矩形会显示在相机预览中(实时)。应用程序也有拍照的方法。但是,我不想保存整个图片,只保存矩形内的区域 - 人脸。当我将矩形坐标提供给 B
我在应用程序中保存图像时遇到问题。我在 Android 版本 4.4.4 上使用 Android 相机 api 1(pre api 21)。设备是 OnePlus One。 当我拍照时,我的应用程序中
我在那里读了很多帖子?但我没有找到正确的答案。 我尝试这样做: @Override public void onPictureTaken(byte[] paramArrayOfByte, Camera
我正在编写一个需要用相机拍摄照片的应用程序。当我尝试拍摄实际照片时出现问题。这是困扰我的代码: final ShutterCallback shutterCallback = new Shut
我的目标是拥有一个带有快照按钮(imgSnap)的自定义相机,当按下该按钮时,我希望应用程序转到另一个 Intent (CameraReview),其中图像显示在 ImageView 中,用户可以在此
我正在开发隐藏相机应用程序,但在拍照方面遇到一些问题。 当我调试应用程序时,我可以看到可以调用 takePicture,但它不会调用 pictureCallback 类。 我正在放置我正在使用的类并等
我需要将图像保存到手机中的自定义文件夹中。我的代码是 @Override public void onPictureTaken(byte[] data, Camera camera)
我一直在尝试在拍摄照片后立即处理图像,即在 onPictureTaken() 回调中。根据我的理解,我应该将字节数组转换为 OpenCV 矩阵,但是当我尝试这样做时整个应用程序会卡住。基本上我所做的就
有没有办法在不将字节数组解码为位图的情况下旋转字节数组? 目前在 jpeg PictureCallback 中,我只是将字节数组直接写入文件。但是图片是旋转的。我想在不解码为位图的情况下旋转它们,希望
所以我阅读了很多关于如何获得图像预览然后保存它的教程。通常的教程涉及使用 SurfaceHolder 和 SurfaceView 以及 PictureCallback。 因为它出现在 document
为了完成相机叠加,我写了一个程序,我发现当我在onPictureTaken()中设置变量“image_data”时,它并没有立即改变值,当我再次调用onPictureTaken时它改变了值我无法解决它
我正在为 Android 构建一个 API,开发人员可以在其中使用我的类拍照。但是,如何使用 onPictureTaken 返回位图。请看我的代码: 这是 mainActivity 上的一个按钮: b
我拥有一台 Samsung Galaxy S3,它能够拍摄大小约为 3000 x 2000 的照片。而且,我目前正在开发一个需要拍摄照片的应用程序。我将手机用作调试器,并设置设备为要捕获的图片提供的最
我正在开发一个从相机对象拍照并将其保存到 SD 卡的应用程序。除了某些事情外,它工作得很好。(我无法配置一些参数来实现示例分辨率)。但是当我拍照时它卡住在屏幕上。我只想在拍照后以相同的方式恢复预览和捕
您好,我刚刚编写了一个从相机获取图像的小 Android 应用程序,我想知道相机参数方法 setPictureFormat() 的实际作用及其影响。据我所知,camera.takePicture()
我要随着 Activity “GameActivity”拍照将图片保存在 SD 卡上将图片用于其他 Activity 问题是,当我只是保存图片而不对其进行任何操作时,图片已保存。当我在 camera.
我是一名优秀的程序员,十分优秀!