代码之家  ›  专栏  ›  技术社区  ›  Flinzar

Android图像旋转并调整大小

  •  0
  • Flinzar  · 技术社区  · 10 年前

    我到处寻找解决方案,但没有任何有用的东西。我正在使用SurfaceView和FrameLayout自定义应用内摄像头。我有一个调用“mCamera.takePicture()”函数的按钮。在回调中,我按原样保存图片;问题是图片被旋转和翻转,并以奇怪的比例缩放。

    我知道这主要是因为我将相机参数的setPreviewSize设置为最佳大小,并使用mCamera.setDisplayOrientation()旋转它。预览看起来很漂亮。但当我拍了一张照片并保存下来时,它就会变得一团糟。

    Camera.Parameters cp = mCamera.getParameters();
    Size theSize = getOptimalPreviewSize(opt, w, h);
    cp.setPreviewSize(theSize.width, theSize.height);
    mCamera.setDisplayOrientation(90);
    mCamera.setParameters(cp);
    

    以上代码是在surfaceChanged函数中编写的。

    如何使保存的图片显示在预览中?

    相机预览中显示内容的屏幕截图。尺寸精细,旋转精细:

    Screenshot of what is shown in the preview of the camera. Size fine, rotation fine.

    这是在拍完照片之后。看看显示器、CD集和插头。它被压扁了,监视器看起来像一个波浪: This is after the picture has been taken. Look at the monitor, collection of CDs and the plug. It's squashed and the monitor looks like a wave.

    1 回复  |  直到 10 年前
        1
  •  1
  •   Alex Cohn    9 年前

    pictureTaken()中返回的图像不受Camera.setDisplayOrientation()的影响。它是Jpeg压缩格式,因此您可以通过Exif标头设置Jpeg旋转,而无需对其进行解码 Camera.setRotation() 但在某些设备上,它实际上在硬件中执行旋转。这是最有效的方法,但一些观众可能仍然会显示旋转的图像。

    或者,您可以使用 JPEG lossless rotation ,使用 jpegtran .

    在SourceForge上,有一个Java开源类 LLJTran 。Android端口为 on GitHub .