2015-05-17 15 views
2

语境

我使用Photos framework显示在我工作的iOS应用程序的用户的图片。在iOS 8.3版本,请求在错误的图像图像PHImageManager结果

作为参考,我上传了几张图片给imgur,在这里你可以找到我正在测试的原始图片,以及我用UIImageView制作的带有粉红色背景的屏幕截图,用“Aspect Fit”配置显示获取的图像。这里的链接:http://imgur.com/a/VPJ9J

我使用两种测试方案:第一,风景图像,其imageOrientationUIImageOrientation.Up(0);其次,一个肖像图像,与UIImageOrientation.Right(3)。你可以检查文档(我会把链接放在这里,但我没有足够的声望,对不起)。

问题

在iPhone 4S(8.1.2的iOS)显示在粉红色的UIImageView内部横向版式风景图像,并与纵向版式的画像,按预期方式。但iPhone 5和6 Plus(均为iOS 8.3)均以横向布局显示两个图像。

代码

这是我使用请求图像的代码:

var targetSize = CGSizeMake(1000, (CGFloat(asset.pixelHeight)/CGFloat(asset.pixelWidth)) * 1000) 

var options = PHImageRequestOptions() 
options.version = PHImageRequestOptionsVersion.Current 
options.deliveryMode = PHImageRequestOptionsDeliveryMode.HighQualityFormat 
options.resizeMode = PHImageRequestOptionsResizeMode.Exact 
options.networkAccessAllowed = true 

PHImageManager.defaultManager().requestImageForAsset(asset, targetSize: targetSize, contentMode: PHImageContentMode.AspectFill, options: options) { (result: UIImage!, info) -> Void in 
    if !info[PHImageResultIsDegradedKey]!.boolValue { 
     println("asset.pixelWidth: \(asset.pixelWidth)") 
     println("asset.pixelHeight: \(asset.pixelHeight)") 
     println("targetSize: \(targetSize)") 
     println("result.size: \(result.size)") 
     println("result.imageOrientation: \(result.imageOrientation.rawValue)") 

     completion(result) 
    } 
} 

测试

这里是执行与这两个图像测试时,我得到的日志:

案例1:iPhone 4S(8.1.2)

横向:

asset.pixelWidth: 3264 
asset.pixelHeight: 2448 
targetSize: (1000.0, 750.0) 
result.size: (1000.0, 750.0) 
result.imageOrientation: 0 

人像:

asset.pixelWidth: 2448 
asset.pixelHeight: 3264 
targetSize: (1000.0, 1333.33) 
result.size: (1000.0, 1332.0) 
result.imageOrientation: 3 

情况2:iPhone 5(8.3)

景观:

asset.pixelWidth: 3264 
asset.pixelHeight: 2448 
targetSize: (1000.0, 750.0) 
result.size: (1000.0, 750.0) 
result.imageOrientation: 0 

人像:

asset.pixelWidth: 2448 
asset.pixelHeight: 3264 
targetSize: (1000.0, 1333.33) 
result.size: (1334.0, 1000.0) 
result.imageOrientation: 3 

案例3:iPhone 6加号(8.3)

景观:

asset.pixelWidth: 3264 
asset.pixelHeight: 2448 
targetSize: (1000.0, 750.0) 
result.size: (1000.0, 750.0) 
result.imageOrientation: 0 

肖像:

asset.pixelWidth: 2448 
asset.pixelHeight: 3264 
targetSize: (1000.0, 1333.33333333333) 
result.size: (1334.0, 1000.0) 
result.imageOrientation: 3 

结论

您可以通过日志查看iOS 8.1.2版本尊重targetSize指定为两个图像,但8.3版本正在提取具有相反尺寸的图像(请求(1000.0, 1333.33)但收到(1334.0, 1000.0))。

现在,好像我唯一的选择是检查它的iOS版本正在运行,然后用旋转方位请求的图像(我只用UIImageOrientation.Right测试,但也有.Left.LeftMirrored.RightMirrored)当反转参数。

不幸的是,PHAsset不包含图片的方向。我只能在向PHImageManager请求图像后才知道它,所以我必须为这些图像提出两个请求,一个获取方向,另一个获取正确的图像。

问题

这是我的逻辑问题吗?或者是iOS中的错误?如果这是一个错误,哪一个是正确的行为,那么iOS 8.3的一个或者更老的版本'?任何人都可以提供其他选项来处理这个问题吗?

对不起,对于很长的文章,和糟糕的英语。提前致谢!

+0

PHImageContentMode.AspectFill代替这个可以试试PHImageContentMode.AspectFit吗? – jarora

+0

你曾经解决过这个问题吗? – AnthonyM

回答

1

我做了一个奇怪的解决方法:

func getAssetImage(asset: PHAsset, completion: (UIImage?) -> Void) { 
    getAssetImage(asset, firstTry: true, completion: completion) 
} 

private func getAssetImage(asset: PHAsset, firstTry: Bool, completion: (UIImage?) -> Void) { 
    let targetSize = CGSizeMake(1000, (CGFloat(asset.pixelHeight)/CGFloat(asset.pixelWidth)) * 1000) 

    let options = PHImageRequestOptions() 
    options.version = PHImageRequestOptionsVersion.Current 
    options.deliveryMode = PHImageRequestOptionsDeliveryMode.HighQualityFormat 
    options.resizeMode = PHImageRequestOptionsResizeMode.Exact 
    options.networkAccessAllowed = true 

    PHImageManager.defaultManager().requestImageForAsset(asset, targetSize: targetSize, contentMode: PHImageContentMode.AspectFill, options: options) { (result: UIImage?, info) -> Void in 
     let degraded = info?[PHImageResultIsDegradedKey] as? NSNumber 

     if degraded != nil && !degraded!.boolValue { 
      print("asset.pixelWidth: \(asset.pixelWidth)") 
      print("asset.pixelHeight: \(asset.pixelHeight)") 
      print("targetSize: \(targetSize)") 
      print("result.size: \(result!.size)") 
      print("result.imageOrientation: \(result!.imageOrientation.rawValue)") 

      if (targetSize.width - targetSize.height) * (result!.size.width - result!.size.height) < 0 { 
       if firstTry { 
        print("Resulting image's dimensions are not in accordance with target size. Reversing dimensions!") 
        self.getAssetImage(asset, firstTry: false, completion: completion) 
       } else { 
        print("Resulting image's dimensions are still not in accordance with target size. Giving up!") 
        completion(nil) 
       } 

      } else { 
       completion(result) 
      } 
     } 
    } 
} 

这种解决方案的性能是相当可疑的,但它是最可靠的方法来处理这个问题之一。