我會盡我所能回答。
如果您的消息來源是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之前對圖像執行此操作。
來源
2017-03-29 00:17:13
dfd
這是否意味着在繪製到像GLKView或MTKView之類的東西時,程度無法用於精確預測像素大小?我使用的targetSizes是image.extent,但由於它們如此多變,它並不總是正確的。到目前爲止,使用inputScaleFactor從CIFilter發出的任何內容都將顯示像素,但UIImage僅顯示點。 – kineticac
當我使用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
感謝您的迴應!我正在處理來自不同來源的照片,其中一個是來自imageRequest的UIImage,另一個是使用CIRAWFilterImpl加載RAW。爲了簡單起見,他們使用相同的代碼來渲染視圖。問題是,image.extent取決於它來自哪裏,這是我現在的問題。解決方案將追蹤它們來自哪裏,以提供正確的目標大小。 – kineticac