2015-01-29 7 views
4

CIImageCGImage으로 변환해야합니다. 현재 사용중인 코드입니다.CIImage를 CGImage로 변환하는 것이 너무 느림

CGImageRef img = [myContext createCGImage:ciImage fromRect:[ciImage extent]]; 

그러나 코드의 라인은 일반 크기의 이미지에서 매우 느립니다. 너무 느려서 제대로 사용할 수 있습니다. 이 CIImagesCGImages으로 변환하는 더 빠른 방법이 있습니까?

결국 Core Graphics을 사용하여 CGImagesCGContext으로 그립니다. 직접 CIImagesCGContext에 그릴 수있는 방법이 있다면 나는 또한 더 빨라야한다고 생각합니다. 이것이 가능한가?

덕분 CIImage documentation 가입일

답변

8

하십시오 CIImage 객체에 연관된 화상 데이터를 갖지만

그것이 화상 아니다. AIImage 객체를 이미지 "recipe"로 생각할 수 있습니다. CIImage 객체는 이미지를 생성하는 데 필요한 모든 정보를 가지고 있지만 코어 이미지는 을 수행 할 때까지 실제로 이미지를 렌더링하지 않습니다. 이 "게으른 평가"방법을 사용하면 코어 이미지가 가능한 한 효율적으로 으로 작동 할 수 있습니다.

이것은 당신이 CGImageRef을 만들 때 귀하의 경우에 발생하는 이미지를 렌더링 할 때까지 CIImage에 대한 적용한 수도 필터링 (또는 더 나은을 적용하도록 요청 )이 실제로 발생하지 않을 것이라는 것을 의미한다. 아마 천천히 겪고있는 이유 일 수 있습니다.

즉, 필터링은 CIImage입니다. 따라서 이미지 크기에 따라 느리게 정의해야합니다.

마지막으로 병목 현상이 실제로 생각하는 곳인지 확인하려면 Instruments를 사용하여 profile your application을 사용해야합니다.

편집

난 그냥 CIColorMap 컬러 필터를 적용하여 iPad3의 장치 카메라 (960x540)에서 오는 이미지 스트림을 필터링하는 샘플 프로젝트를 빌드 시도하고 나는 (초당 60 프레임 이상 받고 있어요 ~ 16ms).

응용 프로그램에 따라이 CIContextColorMapFilterinputGradientImage (그 이상 변경하지 않는 경우 시간) 재사용 모든 반복에 단지 inputImage을 업데이트하여 더 나은 성능을 얻을 수 있습니다.

예를 들어, prepareFrameFiltering을 한 번 호출 한 다음 처리하려는 모든 프레임에 대해 applyFilterToFrame: 번을 반복하여 호출합니다.

@property (nonatomic, strong) CIContext *context; 
@property (nonatomic, strong) CIFilter *colorMapFilter; 

- (void)prepareFrameFiltering { 
    self.context = [CIContext contextWithOptions:nil]; 
    CIImage *colorMap = [CIImage imageWithCGImage:[UIImage imageNamed:@"gradient.jpg"].CGImage]; 
    self.colorMapFilter = [CIFilter filterWithName:@"CIColorMap"]; 
    [self.colorMapFilter setValue:colorMap forKey:@"inputGradientImage"]; 
} 

- (void)applyFilterToFrame:(CIImage *)ciFrame {  
    // filter 
    [self.colorMapFilter setValue:ciFrame forKey:@"inputImage"]; 
    CIImage *ciImageResult = [self.colorMapFilter valueForKey: @"outputImage"]; 

    CGImageRef ref = [self.context createCGImage:ciImageResult fromRect:ciFrame.extent]; 

    // do whatever you need 

    CGImageRelease(ref); 
} 
+0

아, 재미 있습니다. 난 몰랐어. 그래서 저는 실제로 사용하고있는 CIFilter가 너무 느리다 고 생각합니다. ColorMap 필터를 사용하고 있습니다. 600x800 사진의 경우 CGI 이미지로 렌더링하려면 약 1 초가 필요합니다. 내가이 일을 여러 번하고 있기 때문에 나에게 너무 비싸다. 어쨌든 당신의 대답에 감사드립니다. 나는 뭔가를 배웠다. 그리고이 프로세스의 속도를 높이는 방법에 대해 알고 있다면 pls에게 알려주십시오. – Laurens

+0

어떤 장치 에서요? –

+0

sry는 언급을 잊어 버렸습니다. 이것은 iossimulator의 내 macbook pro에있었습니다. 실제 장치에서는 더욱 악화 되겠습니다. – Laurens

2

CIImage를 렌더링하는 가장 빠른 방법은 EAGLContext로 렌더링하는 것입니다.

CI가 GPU에서는 작동하지만 CG는 CPU 렌더러이기 때문에 CIImage를 CGContext로 렌더링하는 것은 성능이 떨어집니다. CI는 CG가 렌더링 할 수 있도록 결과를 GPU에서 CPU로 다시 읽어야합니다.

참고 : 이미지가 4K보다 작 으면 createCGImage :가 호출 될 때이 읽기가 발생합니다. 이미지가 더 큰 경우 CGContextDrawImage가 호출 될 때 발생합니다.