从android摄像头旋转图片

从android摄像头旋转图片,android,camera,orientation,android-camera,Android,Camera,Orientation,Android Camera,我正在设置摄影机的旋转: stopPreview(); Camera.Parameters p = mCamera.getParameters(); p.setRotation(90); mCamera.setParameters(p); startPreview(); 当设备处于水平方向时拍摄照片。我需要照片旋转到垂直方向。但当我保存jpeg时,它从不旋转,它总是水平的 protected void onJpegPicture(byte[] data, int width, int heig

我正在设置摄影机的旋转:

stopPreview();
Camera.Parameters p = mCamera.getParameters();
p.setRotation(90);
mCamera.setParameters(p);
startPreview();
当设备处于水平方向时拍摄照片。我需要照片旋转到垂直方向。但当我保存jpeg时,它从不旋转,它总是水平的

protected void onJpegPicture(byte[] data, int width, int height) {
    saveJpeg(data, file);
}
我错过什么了吗?我不认为我应该在拍照后手动旋转照片。我想照相机应该能帮我做到这一点


setRotation参数并不重要。我尝试了所有可能的值0、90、180、270。

使用此方法,将图像本身和旋转度(在您的情况下为90度)传递给它

public static Image rotate(Image img, double angle){
    double sin = Math.abs(Math.sin(Math.toRadians(angle))), cos = Math.abs(Math.cos(Math.toRadians(angle)));
    int w = img.getWidth(null), h = img.getHeight(null);
    int neww = (int) Math.floor(w * cos + h * sin), newh = (int) Math.floor(h
        * cos + w * sin);
    BufferedImage bimg = toBufferedImage(getEmptyImage(neww, newh));
    Graphics2D g = bimg.createGraphics();
    g.translate((neww - w) / 2, (newh - h) / 2);
    g.rotate(Math.toRadians(angle), w / 2, h / 2);
    g.drawRenderedImage(toBufferedImage(img), null);
    g.dispose();
    return toImage(bimg);
}

使用此方法时,将图像本身和旋转度(在您的情况下为90度)传递给它

public static Image rotate(Image img, double angle){
    double sin = Math.abs(Math.sin(Math.toRadians(angle))), cos = Math.abs(Math.cos(Math.toRadians(angle)));
    int w = img.getWidth(null), h = img.getHeight(null);
    int neww = (int) Math.floor(w * cos + h * sin), newh = (int) Math.floor(h
        * cos + w * sin);
    BufferedImage bimg = toBufferedImage(getEmptyImage(neww, newh));
    Graphics2D g = bimg.createGraphics();
    g.translate((neww - w) / 2, (newh - h) / 2);
    g.rotate(Math.toRadians(angle), w / 2, h / 2);
    g.drawRenderedImage(toBufferedImage(img), null);
    g.dispose();
    return toImage(bimg);
}

假设您在调用takePicture之前调用了setParameters,那么您拥有的代码片段应该可以工作。您可以尝试在调用takePicture之前设置参数,而不是在开始预览之前,但这并不重要

请注意,您可能不想在这里使用90,因为图片的方向是相对于传感器的方向而不是当前UI方向确定的。传感器是否与纵向或横向对齐取决于您的设备-您可以使用进行检查。尽管如此,如果您尝试了所有旋转值,应该会看到效果


您在哪些设备上看到这种行为?另外,您如何查看最终图像?一些图像查看器仍然无法正确解释JPEG旋转字段,尽管任何设备上的gallery应用程序都应该正确解释JPEG旋转字段,特别是如果它是默认应用程序。

假设您在调用takePicture之前调用了setParameters,那么您拥有的代码片段应该可以工作。您可以尝试在调用takePicture之前设置参数,而不是在开始预览之前,但这并不重要

请注意,您可能不想在这里使用90,因为图片的方向是相对于传感器的方向而不是当前UI方向确定的。传感器是否与纵向或横向对齐取决于您的设备-您可以使用进行检查。尽管如此,如果您尝试了所有旋转值,应该会看到效果


您在哪些设备上看到这种行为?另外,您如何查看最终图像?一些图像查看器仍然无法正确解释JPEG旋转字段,尽管任何设备上的gallery应用程序确实应该这样做,特别是如果它是默认应用程序。

尝试旋转相机及其预览。i、 e

//rotate preview
camera.setDisplayOrientation(90);
//rotate camera
Camera.Parameters p = camera.getParameters();
p.setRotation(90);
camera.setParameters(p);

在几个HTC设备上进行了测试,效果良好。

尝试旋转相机和预览。i、 e

//rotate preview
camera.setDisplayOrientation(90);
//rotate camera
Camera.Parameters p = camera.getParameters();
p.setRotation(90);
camera.setParameters(p);

在数台HTC设备上进行了测试,效果良好。

我不想手动执行此操作。将图像旋转90倍是一项简单的任务,所以所有能够旋转任何角度的方法都太复杂了。此外,android设备内存不足。我不想在内存中保留两份旋转前后的img。我不想浪费时间从驱动器中保存和加载img。没有好的方法来解决您的问题。setRotation不能保证图像正确旋转。你应该手动调整图像的大小。我不想手动调整。将图像旋转90倍是一项简单的任务,所以所有能够旋转任何角度的方法都太复杂了。此外,android设备内存不足。我不想在内存中保留两份旋转前后的img。我不想浪费时间从驱动器中保存和加载img。没有好的方法来解决您的问题。setRotation不能保证图像正确旋转。你应该手动调整你的图像大小。我现在不需要正确的旋转,我想要旋转-这样我用90作为旋转,并尝试了其他常量值。这在索尼xperia上不起作用。我在网上发现,这也是其他手机的常见问题。制造商没有满足android关于照片旋转的要求。不管我的手机是水平还是垂直,也不管我设置了哪个旋转方向,我总是水平拍摄。我们在较新的Android版本中增加了更好的测试,所以至少较新的设备不应该再出现这些问题。我现在不需要正确的旋转,我想要旋转——这样我就用90作为旋转,并尝试了其他常量值。这在索尼xperia上不起作用。我在网上发现,这也是其他手机的常见问题。制造商没有满足android关于照片旋转的要求。无论我的手机是水平还是垂直方向拍照,也不管我设置了哪个旋转方向,我总是以水平方向拍照。我们在较新的Android版本中添加了更好的测试,因此至少较新的设备不应该再出现这些问题。是的,它也与我的三星Galaxy S4配合使用。它是否依赖于设备?是的,它还与我的三星Galaxy S4配合使用。它依赖于设备吗?