2017-04-30 95 views
1

將CIFilter應用於使用相機拍攝的照片後,所拍攝的圖像會自動收縮並重新定位。將CIFilter應用於UIImage會導致調整大小和重新定位圖像

我在想,如果我能夠獲得原始圖像的大小和方向,它將相應地縮放並將圖像視圖固定到屏幕的角落。然而,這種方法沒有什麼改變,也沒有意識到我可以正確地將圖像縮放到屏幕的全尺寸。

func applyBloom() -> UIImage { 
    let ciImage = CIImage(image: image) // image is from UIImageView 

    let filteredImage = ciImage?.applyingFilter("CIBloom", 
               withInputParameters: [ kCIInputRadiusKey: 8, 
                    kCIInputIntensityKey: 1.00 ]) 
    let originalScale = image.scale 
    let originalOrientation = image.imageOrientation 


    if let image = filteredImage { 
    let image = UIImage(ciImage: image, scale: originalScale, orientation: originalOrientation) 
    return image 
    } 

    return self.image 
} 

圖片說明: 照片捕獲並與空間距作爲一個圖像收縮的結果的圖像的屏幕截圖。

enter image description here

+0

從CIImage到UIImage的轉換中刪除'scale'和'orientation'參數,事情會很好 –

回答

2

嘗試這樣的事情。替換:

func applyBloom() -> UIImage { 
    let ciInputImage = CIImage(image: image) // image is from UIImageView 
    let ciOutputImage = ciInputImage?.applyingFilter("CIBloom", 
              withInputParameters: [kCIInputRadiusKey: 8, kCIInputIntensityKey: 1.00 ]) 
    let context = CIContext() 
    let cgOutputImage = context.createCGImage(ciOutputImage, from: ciInputImage.extent) 
    return UIImage(cgImage: cgOutputImage!) 
} 
  • 我保持各種變量來幫助解釋發生了什麼。
  • 顯然,根據您的代碼,可能需要對可選項和展開進行一些調整。

發生了什麼是 - 採取過濾/輸出CIImage,並使用CIContext,寫一個CGImage輸入CIImage的大小。

  • 請注意,CIContext價格昂貴。如果你已經創建了一個,你應該可以使用它。
  • 非常多,UIImage 尺寸與CIImage 範圍相同。 (我說的很多,因爲一些生成的CIImages可能有範圍無限範圍。)
  • 根據您的具體需求(和您的UIImageView),您可能希望使用輸出CIImage範圍。通常情況下,它們是一樣的。

最後,一個建議。如果您試圖使用CIFilter對圖像(如照片編輯器)進行「接近實時」更改,請考慮使用CIImages和012i優於UIImages和UIImageView的主要性能改進。前者使用設備GPU而不是CPU。

+0

我很欣賞這個解釋的細節!解決方案工作約90%。就像我之前創建上下文的嘗試一樣,輸出會將圖像旋轉90度。方向的簡單修復就是一個竅門。 我可能需要做一些關於使用CIContext和EAGLContext的研究,以便通過CPU使用GPU來計算出最佳的攻擊計劃。非常感謝,您提供的所有信息都幫助了很多! – lifewithelliott

+1

@lifewithelliott,這是CoreImage的一個很好的鏈接:https://www.objc.io/issues/21-camera-and-photos/core-image-intro/到頂部是一個鏈接到一個GitHub項目,他們被分類GLKView作爲FilteredImageView。它具有設置來處理不同的contentModes(aspectFit,aspectFIll等),同時設置EAGLContext和CIContext。 – dfd

+0

我最近發現CIFilters在通過相機圖像更新的圖像上執行時使用標準iPhone相機分辨率。這根本不匹配像素或點分辨率。例如,iPhone 6s plus使用1280x720。 – VagueExplanation

相關問題