Swift: CIAffine Clapp를 사용하여 가장자리까지 아름다운 흐릿한 이미지 만들기

12672 단어 Swift

CIAffine Clamp 는 무엇입니까?


CIAffineClamp 이미지에 필터를 적용하면 이미지 가장자리(위아래 좌우 1px)를 여러 방향으로 무한히 확장하는 가상 이미지 데이터를 생성할 수 있습니다.필터(다음 그림)를 사용하여 픽셀 주위의 픽셀을 샘플링하여 해당 픽셀의 색상을 결정할 때 이미지 가장자리의 결점을 보완할 수 있습니다.
↓ 이런 놈


↑ 기본적으로 참고 범위를 초과한 부분은 투명색으로 보충한다.

CI 고ussianBlur를 직접 사용하는 경우



왼쪽) 원시, 오른쪽) 모호 처리 결과
그림 가장자리의 색이 옅어지고 모호성이 약하다는 것을 알 수 있다.

출처

// オリジナル画像
let nsImage = NSImage(imageLiteralResourceName: "Test")        
guard let imageData = nsImage.tiffRepresentation, let ciImage = CIImage(data: imageData) else { return }

// ガウシアン・フィルタ
guard let blurFilter = CIFilter(name: "CIGaussianBlur") else { return }
blurFilter.setValue(ciImage, forKey: kCIInputImageKey)
blurFilter.setValue(5, forKey: kCIInputRadiusKey)
guard let blurImage = blurFilter.outputImage else { return }
let context = CIContext(options: nil)
guard let resultImage = context.createCGImage(blurImage, from: CGRect(origin: .zero, size: nsImage.size)) else { return }

resultView.image = NSImage(cgImage: resultImage, size: nsImage.size)

CIAffineClamp를 통해 CIGaussianBlur를 간접적으로 사용하는 경우



왼쪽) 원본, 중앙) CIAffine Clamp 시점 결과, 오른쪽) 모호 처리 결과
그림의 가장자리마저 희미해진 것을 알 수 있다.

출처

// オリジナル画像
let nsImage = NSImage(imageLiteralResourceName: "Test")        
guard let imageData = nsImage.tiffRepresentation, let ciImage = CIImage(data: imageData) else { return }

// CIAffineClamp
guard let clampFilter = CIFilter(name: "CIAffineClamp") else { return }
clampFilter.setValue(ciImage, forKey: kCIInputImageKey)
clampFilter.setValue(CGAffineTransform(scaleX: 1.0, y: 1.0), forKey: kCIInputTransformKey)
guard let clampImage = clampFilter.outputImage else { return }
let context = CIContext(options: nil)
let rect = CGRect(origin: CGPoint(x: -25, y: -25), size: CGSize(width:  nsImage.size.width + 50, height: nsImage.size.height + 50))
guard let cgImage = context.createCGImage(clampImage, from: rect) else { return }

imageView.image = NSImage(cgImage: cgImage, size: rect.size)

// ガウシアン・フィルタ
guard let blurFilter = CIFilter(name: "CIGaussianBlur") else { return }
blurFilter.setValue(clampImage, forKey: kCIInputImageKey)
blurFilter.setValue(5, forKey: kCIInputRadiusKey)
guard let blurImage = blurFilter.outputImage else { return }
guard let resultImage = context.createCGImage(blurImage, from: CGRect(origin: .zero, size: nsImage.size)) else { return }

resultView.image = NSImage(cgImage: resultImage, size: nsImage.size)

감상


CIFilter는 매우 잘 조합되어 있어 고속 영상 처리를 효과적으로 할 수 있으니 총포를 사용하십시오.

좋은 웹페이지 즐겨찾기