重新缩放时 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
从一开始)。
我真的不明白这是怎么回事,但也许某些图像数据在某处被引用而不是被复制,这会导致不一致。我一定是在规范中遗漏了一些细节......
这个很奇怪...
背景: 我的 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
从一开始)。
我真的不明白这是怎么回事,但也许某些图像数据在某处被引用而不是被复制,这会导致不一致。我一定是在规范中遗漏了一些细节......