최선을 다해 답변 드리겠습니다.
소스가 UIImage
인 경우 size
은 범위와 동일합니다. 하지만 제발,이 UIImageView되지 않습니다 (크기는 포인트입니다). 그리고 우리는 단지 소스 이미지에 대해 이야기하고 있습니다.
CIFilter를 통해 무언가를 실행하면 사물을 조작한다는 의미입니다. 모두 색상을 조작하는 경우 크기/범위를 변경해서는 안됩니다 (자신 만의 CIColorKernel
을 만드는 것과 동일). 픽셀 단위로 작동합니다.
그러나 CIFilter에 따라 도 잘 맞을 수 있습니다. 크기/범위가 변경 될 수 있습니다. 특정 필터는 마스크 또는 타일을 만듭니다. 실제로는 범위 인이 무한대입니다. 다른 것들 (블러는 좋은 예입니다)은 샘플 픽셀을 둘러 쌈으로써 소스 이미지의 크기를 넘어서는 "픽셀"을 샘플링하기 때문에 실제로 확장됩니다. (사용자 정의 현물은 CIWarpKernel
입니다.)
예, 꽤 있습니다. 결론을 위해 :
- 필터는 무엇을하고 있습니까? 단순히 픽셀의 RGB를 확인하고 무엇인가해야합니까? 그런 다음 UIImage 크기는 출력 CIImage 범위 여야합니다.
- 필터가 픽셀 주변 픽셀에 따라 뭔가를 생성합니까? 그러면 출력 CIImage 범위가 약간 더 커집니다. 필터에 따라 얼마나 다를 수 있습니다.
- 입력에 관계없이 무언가를 생성하는 필터가 있습니다. 이것들의 대부분은 무한 할 수 있기 때문에 진실한 범위가 없을 수도 있습니다.
포인트는 UIKit과 CoreGraphics에서 항상 작동합니다. 픽셀? 어떤 시점에서 CoreImage는하지만, 당신이 신경 쓰지 말아야 할 점은 저레벨입니다 (당신이 직접 커널을 작성하고 싶지 않다면). 익스텐트는 대개 UIImage 크기와 같지만 위의 내용을 명심하십시오.성능에 영향을 미칠로서
편집
많은 이미지 (특히 RAW 사람이) 너무 큰 크기를 가질 수있다. 일관된 CI 성능을 유지할 수 있도록 이미지를 특정 사각형으로 크기를 조정하는 UIImage 확장이 있습니다.
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으로 확대됩니다. 나는 이미지를 렌더링하기 전에 그리고 CIImage를 만들어서 CIFilter에서 사용할 수 있습니다.
출처
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. 나는 UIImage처럼 CIImage를 꽤 많이 취급합니다. 즉, UIImageView와 같은 GLKView를 레이아웃하고, Draw (rect :)에서 AspectFit을 설정하고, GLKView에 이미지를 제공하고, setNeedsDisplay()를 호출하여 트리거합니다. 나는 자동 레이아웃을 사용하는 레이아웃을 제외하고 픽셀/포인트에 대해 정말로 신경 쓰지 않습니다. 희망이 도움이됩니다. – dfd
응답 해 주셔서 감사합니다! 다른 소스에서 오는 사진으로 작업하고 있는데, 하나는 imageRequest의 UIImage이고 다른 하나는 CIRAWFilterImpl로 RAW를로드하는 것입니다. 일을 단순하게 유지하기 위해 동일한 코드를 사용하여 뷰에 렌더링합니다. 문제는 image.extent가 어디서 왔는지에 따라 다르다는 것입니다. 이것이 바로 내 문제입니다. 솔루션은 올바른 대상 크기를 제공하기 위해 원래 위치를 추적하는 것입니다. – kineticac