2017-03-28 8 views
1

저는 CIImage로 작업하고 있으며 선형 이미지가 아니라는 것을 알고 있지만 일부 데이터를 보유하고 있습니다.CIImage 범위 (픽셀 또는 점)?

제 질문은 CIImage의 extent 속성이 픽셀이나 포인트를 반환하는지 여부입니다. 아주 작은 말인 documentation에 따르면, 그것은 작업 공간 좌표입니다. 이것은 CIImage에서 픽셀/포인트를 얻을 수있는 방법이 없다는 것을 의미하며 포인트를 얻기 위해 .size 속성을 사용하려면 UIImage로 변환해야합니다.

특정 크기의 UIImage가 있으며 UIImage를 사용하여 CIImage를 만들면 범위가 점으로 표시됩니다. 그러나 CIFmter를 실행하여 CIFilter를 확장하면 크기가 픽셀 값으로 반환되는 경우가 있습니다.

답변

1

최선을 다해 답변 드리겠습니다.

소스가 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에서 사용할 수 있습니다.

+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. 나는 UIImage처럼 CIImage를 꽤 많이 취급합니다. 즉, UIImageView와 같은 GLKView를 레이아웃하고, Draw (rect :)에서 AspectFit을 설정하고, GLKView에 이미지를 제공하고, setNeedsDisplay()를 호출하여 트리거합니다. 나는 자동 레이아웃을 사용하는 레이아웃을 제외하고 픽셀/포인트에 대해 정말로 신경 쓰지 않습니다. 희망이 도움이됩니다. – dfd

+0

응답 해 주셔서 감사합니다! 다른 소스에서 오는 사진으로 작업하고 있는데, 하나는 imageRequest의 UIImage이고 다른 하나는 CIRAWFilterImpl로 RAW를로드하는 것입니다. 일을 단순하게 유지하기 위해 동일한 코드를 사용하여 뷰에 렌더링합니다. 문제는 image.extent가 어디서 왔는지에 따라 다르다는 것입니다. 이것이 바로 내 문제입니다. 솔루션은 올바른 대상 크기를 제공하기 위해 원래 위치를 추적하는 것입니다. – kineticac

1

나는 이것을 포인트로 생각해보기를 권합니다. 눈금이없고 화면이 없습니다 (CIImage는 그려지는 것이 아닙니다). 따라서 픽셀이 없습니다.

CGImage를 기본으로하는 UIImage가 그리기의 기초이며 CGImage 이외에도 축척이 있습니다. 화면 해상도와 함께 포인트에서 픽셀로의 변환을 제공합니다.