重新缩放时 UIImage 颠倒 - 有时

UIImage turns upside down when rescaled - sometimes

这个很奇怪...

背景: 我的 iPad 应用支持横向,不支持纵向。它使用 UIImagePickerController 拍照。拍照后,我将它们显示为 UICollectionView 中的小缩略图。

首先,我注意到在 横向 方向拍摄照片时,一切正常。但是,当我以 左横向 方向拍摄照片,并将获得的图像应用到我的单元格图像视图时,它显示颠倒了。

经过一番搜索,我找到了 this answer,它解决了我的问题。基本上,在 横向 方向拍摄的照片将 imageOrientation 属性 设置为 .Down。我使用了这段代码(switch 语句):

extension MyViewController : UIImagePickerControllerDelegate
{
    func imagePickerController(picker: UIImagePickerController,
        didFinishPickingMediaWithInfo info: [String : AnyObject]
        )
    {

        var image:UIImage!

        if (info[UIImagePickerControllerEditedImage] as? Bool) == true {
            image = info[UIImagePickerControllerEditedImage] as? UIImage
        }
        else {
            image = info[UIImagePickerControllerOriginalImage] as? UIImage
        }

        if image == nil {    
            return 
        }

        switch image.imageOrientation {

        case .Up, .UpMirrored:
            break

        default:
            image = UIImage(CGImage: image.CGImage!, scale: 1.0, orientation: UIImageOrientation.Up)
        }

到目前为止,还不错。

接下来,我想也许我最好存储一个额外的、调整大小的原始图像版本,它的大小更接近实际缩略图,以减少显示多个缩略图时的内存压力:在这里,我假设 UIImage 存储原始(大)图像,无论它如何调整大小以适应视图的边界。

所以,我使用这段代码生成了一个缩略图:

    UIGraphicsBeginImageContextWithOptions(newSize, true, 0.0)
    image.drawInRect(CGRectMake(0, 0, newSize.width, newSize.height))
    let thumbnailImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

现在,同样的事情再次发生在缩略图上:当在左侧横向拍摄时,它会上下颠倒显示(即使调整大小是基于已经进行方向校正的图像)。此外,相同的方向修复将不起作用:记录缩略图的 imageOrientation 属性 显示 它已经设置为 ".Up":

switch thumbnailImage.imageOrientation {
    case .Up, .UpMirrored:
        print("Thumb orientation is UP")
        // > THIS CASE ALWAYS RUNS
        break

    default:
        print("Thumb orientation is NOT UP")
        // > THIS CASE NEVER RUNS             
    }

上面的调整大小代码不可能是天生的错误,因为它适用于一种设备方向(横向)!怎么回事?

也许我应该在固定原始图像的方向时强制垂直翻转缩略图?但这听起来像是黑客攻击。

我不明白为什么,在以新方向(.Down 固定为 .Up)复制原始图像后,它显示直立,但该固定图像的调整大小副本却没有(尽管继承了 .Up 方向)。

好的,找到了解决方法:先创建缩略图,然后修复(如有必要)原始图像和缩略图的方向(通过复制它们):

// Create thumbnail:

UIGraphicsBeginImageContextWithOptions(CGSizeMake(94, 76), true, 0.0)

image.drawInRect(CGRectMake(0, 0, 94, 76))

var thumbnailImage = UIGraphicsGetImageFromCurrentImageContext()

UIGraphicsEndImageContext()


// Fix orientation:

switch image.imageOrientation {
case .Up, .UpMirrored:
    break

default:
    image = UIImage(CGImage: image.CGImage!, scale: 1.0, orientation: UIImageOrientation.Up)
}


let imageData = UIImagePNGRepresentation(image)


switch thumbnailImage.imageOrientation {
case .Up, .UpMirrored:
    break

default:
    thumbnailImage = UIImage(CGImage: thumbnailImage.CGImage!, scale: 1.0, orientation: UIImageOrientation.Up)
}

// (...use both images...)

仍然和以前一样,从未执行缩略图重新定向案例 (缩略图方向始终等于 .Up 从一开始)。

我真的不明白这是怎么回事,但也许某些图像数据在某处被引用而不是被复制,这会导致不一致。我一定是在规范中遗漏了一些细节......