2013-08-23 1 views
12

MKMapView의 스크린 샷에 이미지 효과를 적용하여 내 유리에 iOS 7 스타일 유리 효과를 사용하려고합니다. 애플이 제공 한 This UIImage category이 내가 기준선으로 사용하고있는 것이다. 이 방법은 원본 이미지를 채도 색조 색상을 적용하고, 무겁게 입력 발스 사용하여 흐림 : 이것은 내가 찾고 있어요 효과가있다GPUImage를 사용하여 iOS 7 유리 효과 다시 만들기

[image applyBlurWithRadius:10.0 
       tintColor:[UIColor colorWithRed:229/255.0f green:246/255.0f blue:255/255.0f alpha:0.33] 
    saturationDeltaFactor:0.66 
       maskImage:nil]; 

,하지만 너무 오래 걸립니다 -에 렌더링 .3.5초 사이 아이폰 4

enter image description here

내 예비 시도로 우수한 GPUImage을 사용하고자하는

은 약 5 ~ 10 배 빠른 속도로왔다, 그러나 나는 바로 그것을 얻을 수없는 것.

GPUImagePicture *stillImageSource = [[GPUImagePicture alloc] initWithImage:image]; 

GPUImageSaturationFilter *saturationFilter = [[GPUImageSaturationFilter alloc] init]; 
saturationFilter.saturation = 0.33; // 1.0 - 0.66; 
[stillImageSource addTarget:saturationFilter]; 

GPUImageMonochromeFilter *monochromeFilter = [[GPUImageMonochromeFilter alloc] init]; 
[monochromeFilter setColor:(GPUVector4){229/255.0f, 246/255.0f, 1.0f, 0.33f}]; 
[monochromeFilter setIntensity:0.2]; 
[saturationFilter addTarget:monochromeFilter]; 

GPUImageFastBlurFilter *blurFilter = [[GPUImageFastBlurFilter alloc] init]; 
blurFilter.blurSize = 2; 
blurFilter.blurPasses = 3; 
[monochromeFilter addTarget:blurFilter]; 

[saturationFilter prepareForImageCapture]; 
[monochromeFilter prepareForImageCapture]; 

[stillImageSource processImage]; 
image = [blurFilter imageFromCurrentlyProcessedOutput]; 

이 있지만 꽤있다

enter image description here

나는 위의 blurSize를 증가하려고하면 흐림, 그것을 충분히 깊은 것 같다,하지만하지 않는, 가까운 이미지를 생성 거의 만화경처럼 격자 모양이됩니다. 두 번째 이미지를 확대하여 여기에서 실제로 눈금을 볼 수 있습니다. 내가 흉내 내고자하는 틴트 컬러는 오버레이 및 블렌딩 대신 이미지를 씻어내는 것처럼 보입니다. 애플 샘플이하는 것처럼 생각합니다.

another SO question에서 @BradLarson이 작성한 의견에 따라 필터를 설정하려고했습니다. 이 효과를 재연하는 데 잘못된 GPUImage 필터를 사용하고 있습니까? 아니면 잘못 설정 한 것입니까?

+0

https://github.com/JagCesar/iOS-blur를 사용해 보셨나요? iOS7에서만 작동하지만 훌륭합니다. –

+0

iOS-Blur는 실행 가능한 솔루션이 아닙니다. 당신은 애플이이 작업을하기 위해 두포에서 무엇을하는지 모르며, iOS 6에서는 작동하지 않습니다. – coneybeare

답변

32

그래, 잠시 동안 여기에서 작업 해봤는데 마침내 작동했습니다. GPUImage의 흐림 필터에 대한 여러 변경 사항을 프레임 워크에 넣었습니다. 결과적으로 컨트롤 센터보기와 같은 용도로 사용하는 Apple 흐림 효과의 복제본을 믿을 수 있다고 생각합니다.

이전 프레임 워크에서 보았던 블러는 사전 계산 된 하나의 반경을 사용했으며, 강도를 높이는 유일한 방법은 입력 이미지에서 픽셀을 샘플링 한 간격을 조정하는 것이 었습니다. 픽셀 당 제한된 수의 샘플을 사용하면 샘플링 된 픽셀 간 간격을 1.5보다 훨씬 크게 변경하면 픽셀을 건너 뛸 때 심각한 차단 아티팩트가 도입되기 시작했습니다.

내가 작성한 새로운 가우시안 블러 구현은 사전 계산 된 가우스 가중치의 성능상의 이점과 가우시안 블러에 임의의 반경 (σ)을 사용하는 기능을 결합합니다. 이것은 다양한 반지름에 필요한 쉐이더를 즉석에서 생성하여 수행합니다. 또한 하드웨어 보간을 사용하여 각 샘플 포인트에 대해 한 번에 두 개의 텍셀을 읽음으로써 주어진 흐림 반경에 필요한 텍스처 샘플의 수를 줄입니다.

새로운 GPUImageiOSBlurFilter는이 튜닝 된 임의 반경 가우시안 블러 필터를 흐리게 처리 한 후 색상에 적용한 색상 보정 필터와 결합합니다.나는 내 대답 here에 아래의 비교를 추가,하지만 보여줍니다 애플의 내장 오른쪽 왼쪽, 나의 새로운 GPUImage 블러 필터를 제어 센터보기에서 흐리게 :

Apple's blurGPUImage's blur

방법으로 성능 향상 (애플의 흐림 현상은 시그마가 48인데, 각 픽셀 당 상당히 큰 영역을 필요로 함), 가우스 블러가 발생하기 전에 4 배의 다운 샘플링을 사용하고 이후 4 배의 업 샘플링을 사용합니다. 이렇게하면 흐리게 처리해야하는 픽셀 수가 16 배 줄어들고 흐림 시그마가 48에서 12로 줄어 듭니다. iPhone 4S는이 필터를 사용하여 약 30ms 내에 전체 화면을 흐리게 만들 수 있습니다.

흐림 효과를 얻는 것이 한 가지입니다. Apple은 여전히 ​​이미지 컨텐츠를 빠르게 볼 수있는 방법을 제공하지 않기 때문에 빠르게 변화하는 컨텐츠의 경우 병목 현상이 발생할 가능성이 가장 큽니다.

+1

그래서 저는'GPUImageiOSBlurFilter'로 전환했기 때문에 훨씬 빠른 렌더링이되었습니다. 라이브 블러 링에는 사용하지 않지만'UITableViewCell'에 표시 할 이미지가 흐려지기 때문에 필요합니다. 따라서 행복하게 처리해야합니다. 감사! – runmad

+0

브래드, GPUImage의 포드 사양을 업데이트 할 수 있습니까? 이전의 0.1.1 스펙에는'GPUImageiOSBlurFilter'가 포함되어 있지 않습니다. 감사! –

+0

@KyrDunenkoff - 당신이 CocoaPods를 언급한다고 가정합니다. 나는 그곳에서 아무 것도 유지하지 않거나 심지어 CocoaPod를 직접 사용하기 때문에 저장소의 최신 빌드를 가리키는 것은 그 일을 책임지고있는 사람에게 달려 있습니다. GitHub 저장소 만 유지 관리합니다. 최신 코드를 원하면 GitHub에서 직접 가져 오는 것이 좋습니다. –