2017-03-28 99 views
1

我正在使用CIImage,雖然我知道它不是線性圖像,但它確實保存了一些數據。以像素或點爲單位的CIImage範圍?

我的問題是CIImage的extent屬性是否返回像素或點?根據documentation,它說很少,它是工作空間座標。這是否意味着無法從CIImage獲取像素/點,我必須轉換爲UIImage才能使用.size屬性獲取點?

我有一個UIImage具有一定的大小,並且當我使用UIImage創建CIImage時,範圍顯示爲點。但是,如果我通過CIFilter來擴展CIImage,我有時會得到像素值返回的範圍。

回答

1

我會盡我所能回答。

如果您的消息來源是UIImage,它的size將與範圍相同。但請注意,這不是一個UIImageView(大小以點爲單位)。我們只是在談論來源圖片。

通過CIFilter運行某些東西意味着您正在操縱事物。如果你所做的只是操縱顏色,它的大小/範圍不應該改變(與創建自己的CIColorKernel相同 - 它逐個像素地工作)。

但是,取決於CIFilter,您可能會正在更改大小/範圍。某些過濾器會創建一個蒙版或圖塊。這些實際上可能具有無限大的範圍!其他(模糊是一個很好的例子)對周圍像素進行採樣,因此它們的範圍實際上會增加,因爲它們會在源圖像大小之外對「像素」進行採樣(定製這些是CIWarpKernel。)

是的,相當多。以此爲底線:

  • 過濾器在幹什麼?它是否需要簡單地檢查一個像素的RGB並做一些事情?然後,UIImage大小應該是輸出CIImage範圍。
  • 濾鏡是否產生依賴於像素周圍像素的東西?然後輸出CIImage範圍稍大。多少可能取決於過濾器。
  • 有些過濾器產生的東西與輸入無關。其中大多數可能沒有真正的程度,因爲它們可以是無限的。

點是UIKit和CoreGraphics總是使用的。像素? CoreImage在某些時候可以做到,但是它的低級別(除非你想編寫自己的內核),你不應該在意。範圍通常可以 - 但請記住上述 - 等於UIImage大小。

編輯

很多圖片(尤其是生的)能有這麼大的尺寸,以影響性能。我有一個UIImage的擴展,它將圖像大小調整爲特定的矩形,以幫助保持一致的CI性能。

extension UIImage { 
    public func resizeToBoundingSquare(_ boundingSquareSideLength : CGFloat) -> UIImage { 
     let imgScale = self.size.width > self.size.height ? boundingSquareSideLength/self.size.width : boundingSquareSideLength/self.size.height 
     let newWidth = self.size.width * imgScale 
     let newHeight = self.size.height * imgScale 
     let newSize = CGSize(width: newWidth, height: newHeight) 
     UIGraphicsBeginImageContext(newSize) 
     self.draw(in: CGRect(x: 0, y: 0, width: newWidth, height: newHeight)) 
     let resizedImage = UIGraphicsGetImageFromCurrentImageContext() 
     UIGraphicsEndImageContext(); 
     return resizedImage! 
    } 
} 

用法:

image = image.resizeToBoundingSquare(640) 

在這個例子中,3200x2000的圖像尺寸將減少到640x400。或者圖像大小或320x200將被放大到640x400。我在渲染它之前以及在創建用於CIFilter的CIImage之前對圖像執行此操作。

+0

這是否意味着在繪製到像GLKView或MTKView之類的東西時,程度無法用於精確預測像素大小?我使用的targetSizes是image.extent,但由於它們如此多變,它並不總是正確的。到目前爲止,使用inputScaleFactor從CIFilter發出的任何內容都將顯示像素,但UIImage僅顯示點。 – kineticac

+0

當我使用GLKView時,它是一個與此類似的子類:https://github.com/objcio/issue-21-core-image-explorer/blob/master/Core%20Image%20Explorer/FilteredImageView.swift。我非常喜歡CIImage,就像我做UIImage一樣。也就是說,我佈置一個GLKView,就像我將一個UIImageView一樣,在draw(rect :)中設置AspectFit,給GLKView一個圖像,並調用setNeedsDisplay()來觸發事物。除了使用自動佈局的佈局外,我並不關心像素/點。希望有所幫助。 – dfd

+0

感謝您的迴應!我正在處理來自不同來源的照片,其中一個是來自imageRequest的UIImage,另一個是使用CIRAWFilterImpl加載RAW。爲了簡單起見,他們使用相同的代碼來渲染視圖。問題是,image.extent取決於它來自哪裏,這是我現在的問題。解決方案將追蹤它們來自哪裏,以提供正確的目標大小。 – kineticac

1

我建議你把它們看作點。沒有縮放和沒有屏幕(CIImage不是繪製的東西),所以沒有像素。

一個由CGImage支持的UIImage是繪製的基礎,除了CGImage它還有一個尺度;再加上屏幕分辨率,使我們可以從點到像素進行轉換。

相關問題