1

我正在为相机设置旋转:

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)。

4

3 回答 3

3

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

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

您在哪些设备上看到了这种行为?另外,您如何查看最终图像?一些图像查看器仍然不能正确解释 JPEG 旋转字段,尽管任何设备上的图库应用程序确实应该(尤其是如果它是默认应用程序)。

于 2013-08-22T00:27:48.337 回答
2

尝试旋转两个相机和它的预览。IE

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

在几台 HTC 设备上测试,它可以工作。

于 2014-04-28T09:19:14.827 回答
0

Image通过将自身传递给它来使用此方法,rotation degree在您的情况下为 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);
}
于 2013-08-20T12:25:12.800 回答