[英]UIImage turns upside down when rescaled - sometimes
這個很奇怪
背景:我的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
屬性表明它已經設置為“ .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
)。
我真的不明白這里發生了什么,但是也許某些圖像數據在某處被引用而不是被復制,這會導致不一致。 我必須在規范中缺少一些細節...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.