【问题标题】:setRotation(90) to take picture in portrait mode does not work on samsung devicessetRotation(90) 以纵向模式拍照不适用于三星设备
【发布时间】:2012-06-16 22:20:57
【问题描述】:

根据文档,setRotation(90) 应该旋转捕获的 JPEG 图片(takePicture 在横向模式下。

这适用于 HTC 手机,但不适用于三星 Google Nexus S 和三星 Galaxy S3。这是一个错误吗?

我知道我可以使用矩阵变换旋转,但希望操作系统可以更有效地执行此操作,并且不想冒在其他设备上过度旋转的风险。

编辑

设置camera.setDisplayOrientation(90); 使预览为纵向模式,但对拍摄的照片没有任何影响。

此外,除了setRotation,我还尝试设置图片大小 - 我将h 与w 翻转:parameters.setPictureSize(1200, 1600);。这也没有任何影响。

解决方案

显然三星手机设置了 EXIF 方向标签,而不是旋转单个像素。正如ariefbayu 建议的那样,使用BitmapFactory 读取位图不支持此标签。他的代码示例就是解决方案,而且这个解决方案也兼容使用inSampleSize。

【问题讨论】:

  • 看看这个答案可能会有所帮助:stackoverflow.com/questions/3841122/…
  • @thinksteep: 不 - 我没有通过 android 控制台看到任何错误。
  • @JohnJSmith:答案与表面上的预览有关。我的问题是关于拍照
  • 我认为这可能也影响了实际拍摄的照片,但那是前一段时间,它是在 HTC 上。
  • @JohnJSmith: 设置 camera.setDisplayOrientation(90);使预览处于纵向模式,但对拍摄的照片没有任何影响。

标签: android android-camera


【解决方案1】:

我尝试就 Exif 标签来回答这个问题。这就是我所做的:

Bitmap realImage = BitmapFactory.decodeStream(stream);

ExifInterface exif=new ExifInterface(getRealPathFromURI(imagePath));

Log.d("EXIF value", exif.getAttribute(ExifInterface.TAG_ORIENTATION));
if(exif.getAttribute(ExifInterface.TAG_ORIENTATION).equalsIgnoreCase("6")){

    realImage=ImageUtil.rotate(realImage, 90);
}else if(exif.getAttribute(ExifInterface.TAG_ORIENTATION).equalsIgnoreCase("8")){
    realImage=ImageUtil.rotate(realImage, 270);
}else if(exif.getAttribute(ExifInterface.TAG_ORIENTATION).equalsIgnoreCase("3")){
    realImage=ImageUtil.rotate(realImage, 180);
}

ImageUtil.rotate():

public static Bitmap rotate(Bitmap bitmap, int degree) {
    int w = bitmap.getWidth();
    int h = bitmap.getHeight();

    Matrix mtx = new Matrix();
    mtx.postRotate(degree);

    return Bitmap.createBitmap(bitmap, 0, 0, w, h, mtx, true);
}

【讨论】:

  • 刚刚做了一些测试。事实证明,三星硬件不会旋转像素,只会将 exif 方向标签设置为数字 6。我将在读取位图时使用您的实用程序。这个解决方案的好处是我仍然可以继续使用 inSampleSize 属性来仅加载缩略图版本,并防止 OutOfMemoryExceptions
  • 嗨,我遇到了同样的问题,我正在尝试实现答案,但我不明白这段代码的去向。什么是可变流?我的代码中没有类似的东西!
  • 嗨,它对我来说很好用,除了创建新的位图(Bitmap.createBitmap(bitmap, 0, 0, w, h, mtx, true);),还有其他方法吗?触发 OutOfMemoryException。
  • 但是 ImageUtil 类在哪里呢?在哪里可以找到它?
  • 我不明白这段代码的去向。请解释你的答案。
【解决方案2】:

Liso22,变量流没有任何区别,只需插入您的位图,但是您得到了它(decodeFile 等)。如果您在使用“ImageUtil.rotate()”时遇到问题,只需将“public static Bitmap rotate()”编写为具有相同参数的方法,并使“真实图像”等于它。无论如何,这个解决方案似乎对我不起作用,无论是纵向还是横向,exif 标签都会返回 1(正常)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-03
    • 2013-10-03
    • 2012-11-06
    • 1970-01-01
    • 2016-10-29
    • 2012-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多