【问题标题】:UIImage turns upside down when rescaled - sometimes重新缩放时 UIImage 会颠倒 - 有时
【发布时间】:2016-01-17 18:46:29
【问题描述】:

这个很奇怪……

背景:我的 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)复制原始图像后,它会竖直显示,但该固定图像的调整大小的副本不会(尽管继承了 @987654331 @ 方向)。

【问题讨论】:

    标签: ios uiimageview uiimage core-graphics uiimagepickercontroller


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-11
      • 1970-01-01
      • 2013-07-25
      • 2018-12-03
      • 2017-01-30
      • 2013-08-08
      • 2016-05-04
      相关资源
      最近更新 更多