【问题标题】:Orientation of captured image is wrong when using AV Foundation使用 AV Foundation 时捕获图像的方向错误
【发布时间】:2014-03-20 18:38:19
【问题描述】:

我正在将 AV Foundation 用于照片捕捉应用程序。用户拍照后,我将主图层的子图层的内容属性设置为等于捕获的照片,即 imageData:

subLayer.contents = (id)[UIImage imageWithData:imageData].CGImage;

这一切都完美无缺,照片确实显示在屏幕上。

唯一的问题是照片显示旋转了 90 度。

知道如何正确显示照片而不是旋转吗?

这是用户拍摄照片时的外观:

但是当我将它显示为子层时,它的外观如下:

【问题讨论】:

标签: ios objective-c uiimage avfoundation calayer


【解决方案1】:

如果这样设置时显示旋转的图像:

subLayer.contents = (id)[UIImage imageWithData:imageData].CGImage;

...你会发现这很好用:

UIImageView *view = [UIImageView initWithImage:[UIImage imageWithData:imageData];
// then add view and display

UIImage 或使用 UIImage 的类可以理解可能影响图像显示的元数据,例如旋转。

因为您直接访问底层 Quartz 图像数据,所以您跳过了 UIImage 显示旋转数据的部分。因此,要么尝试以另一种方式执行此操作(例如,使用 UIImage 设置背景图像),要么自己旋转 CGImage(使用各种 CG 函数)。

【讨论】:

  • 您能否提供一些示例代码:“自己旋转 CGImage(使用各种 CG 功能)”?在过去的 20 分钟里,我一直在尝试,但无法让它改变它的方向。
  • 在核心图形方面,有大约一百万种方法可以给猫剥皮。基本上你应该从原始 UIImage 中获取方向,使用 CGAffineTransformMakeRotation 进行变换以正确旋转它,创建位图上下文,应用变换并保存上下文。旋转与缩放齐头并进,因此如果您需要缩放,也可以使用变换。您还可以从原始图像中获取 CIImage,应用一些 CIFilter 来旋转和缩放,然后从中获取新的 CGImage。这很简单,但也很重要——查看文档!
  • 感谢您的详细回复。我最终在这里使用了这个解决方案:stackoverflow.com/a/10548409/3117509 ...现在唯一的问题是图像被拉伸和扭曲。我正在使用 AVCaptureVideoPreviewLayer 并将其设置为仅占用屏幕的一半。相机是否有可能捕获整个屏幕而不是只捕获一半?
【解决方案2】:
UIImage *img = [UIImage imageWithData:imageData];
    UIImage *image_Corrected;
    if (img.imageOrientation !=UIImageOrientationUp)
    {

        image_Corrected=[UIImage imageWithCGImage:img.CGImage scale:0.0 orientation:UIImageOrientationUp];
    }
    else
    {
        image_Corrected=img;

    }

【讨论】:

    【解决方案3】:

    相机总是以相同的方向拍照,根据当前方向旋转相机或更改其 EXIF 元数据字典是软件的职责。
    如果您使用静止图像捕获或输出数据缓冲区,处理此问题的方式会有一些细微差别。
    我在我的博客上写了一篇关于它的文章:EXIF pain
    我建议您也检查that sample code from Apple site,可能是与AVCam 最完整的之一。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多