Ios UIImage在重新缩放时会颠倒-有时
这个很奇怪 背景:我的iPad应用程序既支持横向,也不支持纵向。它使用UIImagePickerController拍照。拍摄完照片后,我在UICollectionView中将它们显示为小缩略图 首先,我注意到,当我在右方向拍摄时,一切都很好。然而,当我以横向向左方向拍摄照片,并将获得的图像应用到我的细胞的图像视图时,它显示为倒置 在搜索了一点之后,我找到了,它解决了我的问题。基本上,在横向左方向拍摄的照片将其Ios UIImage在重新缩放时会颠倒-有时,ios,uiimageview,uiimage,core-graphics,uiimagepickercontroller,Ios,Uiimageview,Uiimage,Core Graphics,Uiimagepickercontroller,这个很奇怪 背景:我的iPad应用程序既支持横向,也不支持纵向。它使用UIImagePickerController拍照。拍摄完照片后,我在UICollectionView中将它们显示为小缩略图 首先,我注意到,当我在右方向拍摄时,一切都很好。然而,当我以横向向左方向拍摄照片,并将获得的图像应用到我的细胞的图像视图时,它显示为倒置 在搜索了一点之后,我找到了,它解决了我的问题。基本上,在横向左方向拍摄的照片将其图像方向属性设置为.Down。我使用了以下代码(switch语句): 到目前为止,一切
图像方向
属性设置为.Down
。我使用了以下代码(switch
语句):
到目前为止,一切都很好。
接下来,我想也许我最好存储一个更接近实际缩略图的原始图像的附加、调整大小的版本,以减少显示多个缩略图时的内存压力:在这里,我假设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
方向)。好的,找到了一个解决方法:先创建缩略图,然后固定(如有必要)原始图像和缩略图的方向(通过复制):
但是,与之前一样,缩略图重新定向的大小写从未执行过(缩略图方向从一开始就始终等于.Up
)
我真的不明白这里发生了什么,但可能一些图像数据被引用到了某处而不是被复制,这会导致不一致。我一定是在规范中遗漏了一些细节…好的,找到了一个解决方法:先创建缩略图,然后修复(如果必要)原始图像和缩略图的方向(通过复制): 但是,与之前一样,缩略图重新定向的大小写从未执行过(缩略图方向从一开始就始终等于
.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
}
// 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...)