重新缩放时UIImage会颠倒 - 有时候

时间:2015-10-19 12:13:54

标签: ios uiimageview uiimage core-graphics uiimagepickercontroller

这个很奇怪......

背景:我的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方向)。

1 个答案:

答案 0 :(得分:0)

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

// 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

我真的不明白这里发生了什么,但也许某些图像数据被引用到某处而不是被复制,这会导致不一致。我必须遗漏规范中的一些细节......