gpt4 book ai didi

android - 如何在onPictureTaken中旋转和翻转位图

转载 作者:太空狗 更新时间:2023-10-29 15:33:40 26 4
gpt4 key购买 nike

我在 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'回调以正确的角度旋转图片,使其显示预览的内容显示。

1


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();
}
}

2


在您的“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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com