2016-06-15 130 views
0

我正在尋找解決方案來保存UIView(及其子視圖)作爲圖像保存到設備照片庫。我想輸出圖像的大小爲1024 x 1024. UIView將始終是一個正方形,因此子視圖將適合在正方形內。結果保存的輸出必須滿足這些需求。使用UIGraphicsBeginImageContextWithOptions縮放視圖和圖像

以下是我有:

let outputSize = CGSize(width: 1024.0, height: 1024.0) 

func imageWithView(view: UIView) -> UIImage { 
    UIGraphicsBeginImageContextWithOptions(outputSize, view.opaque, 0.0) 
    view.drawViewHierarchyInRect(view.bounds, afterScreenUpdates: false) 
    let outputImage: UIImage = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext() 
    return outputImage 
} 

我傳遞到參數上面的視圖是方觀點。下面的截圖是結果:

crop scale is off

在我的故事板,UIView的是方在280x280的(如果有差別。)我期望的結果是UIView的(和照片裏面它)獲取保存在黑框的全尺寸(1024平方)。謝謝您的幫助。

編輯

這裏是一個更新版本: 雖然滿足在1024平方輸出視圖的需求,質量不是非常理想。想用CGBitmapContextCreate & CGContextDrawImage方法在這裏討論:http://nshipster.com/image-resizing/

func stackOverflow() -> UIImage{ 

    let hasAlpha = false 
    let scale: CGFloat = 1.0 

    UIGraphicsBeginImageContextWithOptions(CGSizeMake(1024.0, 1024.0), !hasAlpha, scale) 

    mainView.drawViewHierarchyInRect(CGRect(origin: CGPointZero, size: CGSizeMake(1024.0, 1024.0)), afterScreenUpdates: false) 

    let scaledImage = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext() 
    return scaledImage 
} 

回答

0

你可以這樣來做:

let image = UIImage(contentsOfFile: self.URL.absoluteString!) 

let size = CGSizeApplyAffineTransform(image.size, CGAffineTransformMakeScale(0.5, 0.5)) 
let hasAlpha = false 
let scale: CGFloat = 0.0 // Automatically use scale factor of main screen 

UIGraphicsBeginImageContextWithOptions(size, !hasAlpha, scale) 
image.drawInRect(CGRect(origin: CGPointZero, size: size)) 

let scaledImage = UIGraphicsGetImageFromCurrentImageContext() 
UIGraphicsEndImageContext() 

如圖here

+0

檢查我上面的修改。爲了滿足我的需求,我不得不調整一些東西。雖然它將最終圖像導出到1024平方米,但圖像質量並不理想。你提供的NSHipster鏈接看起來像它有一個更強大的解決方案:CGBitmapContextCreate&CGContextDrawImage - 這將允許我用CGInterpolationQuality指定質量。因爲它正在尋找一個CGImage參數,所以我很難將它導出UIView及其子視圖。你能提供關於如何使這個工作滿足上述需求的任何提示嗎?謝謝。 – Joe

+0

實際發生了什麼?你無法將UIImage轉換爲CGImage或什麼?你可以通過'UIImage(name:「Something」)?CGImage'來完成這個任務,並按照其中的步驟進行操作。 – Dershowitz123

+0

我得到了UIImage作爲CGImage,因此工作正常。問題是將方形UIView合併到方法中。我相信它需要被添加到CGContextDrawImage或CGBitmapCreateImage中,但我沒有試過任何有價值的結果。 – Joe