当重新缩放时,UIImage会倒过来-有时



这个很奇怪…

背景:我的iPad应用程序支持横向,不支持纵向。它用UIImagePickerController拍照。拍摄照片后,我将它们作为缩略图显示在UICollectionView中。

首先,我注意到在横向右方向拍照时,一切都很好。然而,当我在横向左方向拍摄照片,并将获得的图像应用到我的单元格的图像视图时,它显示颠倒。

搜索了一下,我找到了这个答案,它解决了我的问题。基本上,在横向左方向拍摄的照片将其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属性显示它已经设置为"。":

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)。

我真的不明白这里发生了什么,但也许一些图像数据在某处被引用而不是被复制,这导致了不一致。我一定是在说明书中遗漏了一些细节……

最新更新