2012-09-06 1 views
2

이미지 필터 적용을 위해 followinf 코드를 사용하고 있습니다. 이것은 축소 된 이미지에서 잘 작동합니다. 그러나 전체 해상도 이미지에 2 개 이상의 필터를 적용하면 앱이 다운됩니다. 메모리 경고가 수신됩니다.코어 이미지 필터를 적용하는 동안 메모리 경고를 처리합니다.

'할당'도구를 열면 CFData (저장소)가 프로그램에서 사용하는 대부분의 메모리를 차지하는 것으로 나타납니다. 전체 해상도 이미지에 2 개 이상의 필터를 적용하면 '전체 바이트'가 54MB까지 올라갑니다. '라이브 바이트'는 12 메가 바이트가 넘는 숫자에 눈을 띄지는 않지만 스파이크는 라이브 바이트가이 숫자에 도달하여 다시 돌아 오는 것을 보여줍니다.

어디로 잘못 가고 있습니까?

- (UIImage *)editImage:(UIImage *)imageToBeEdited tintValue:(float)tint 
{ 
CIImage *image = [[CIImage alloc] initWithImage:imageToBeEdited]; 
NSLog(@"in edit Image:\ncheck image: %@\ncheck value:%f", image, tint); 

[tintFilter setValue:image forKey:kCIInputImageKey]; 
[tintFilter setValue:[NSNumber numberWithFloat:tint] forKey:@"inputAngle"]; 

CIImage *outputImage = [tintFilter outputImage]; 
NSLog(@"check output image: %@", outputImage); 
return [self completeEditingUsingOutputImage:outputImage]; 
} 

- (UIImage *)completeEditingUsingOutputImage:(CIImage *)outputImage 
{ 
CGImageRef cgimg = [context createCGImage:outputImage fromRect:outputImage.extent]; 
NSLog(@"check cgimg: %@", cgimg); 
UIImage *newImage = [UIImage imageWithCGImage:cgimg]; 
NSLog(@"check newImge: %@", newImage); 
CGImageRelease(cgimg); 
return newImage; 
} 

편집 : 나는 또한 전무로 cgimg을 시도했다. 도와주지 않았어. 제 2의 함수 내에 컨텍스트 선언 및 정의를 두어 보았습니다. 도와주지 않았어. 함수 내부에서 선언과 정의를 이동하려고 시도했지만 도움이되지 않았습니다.

AlsoCrash 내가 제작 된 cgimg 메모리에 공간의 대부분을 가져다가 발표 점점되지

CGImageRef cgimg = [context createCGImage:outputImage fromRect:outputImage.extent]; 

답변

1

에서 발생합니다.

더 작은 값으로 파일러를 호출하면 CFData (store) 메모리 값이 samller 값으로 돌아가므로 충돌을 피할 수 있습니다.

그래서 필터를 적용한 후 동일한 필터를 'nil'과 같은 이미지로 호출합니다. 4 개의 필터를 모두 적용한 후 484kb 또는 48MB의 메모리를 다시 사용합니다.

또한이 필터는 주 스레드 대신 백그라운드 스레드에 적용합니다. 주 스레드에 다시 적용하면 충돌이 발생합니다. 아마도 메모리를 해제 할 충분한 시간이 없을 것입니다. 나는 모른다. 하지만 이제는 이러한 일이 순조롭게 진행되고 있습니다.

1
// where is your input filter name like this: 

[tintFilter setValue:image forKey:@"CIHueAdjust"]; 

// I think you have a mistake in outputImage.extent. You just write this 

CGImageRef cgimg = [context createCGImage:outputImage fromRect:outputImage extent]; 
+0

나는 그것이 내가 작성한 것과 같다고 생각한다. 이 문제의 해결 방법을 찾을 수있었습니다. 실제로 그것을 해결하지 않습니다. 나는 그것을 아래에 게시하고있다. – neeraj

+0

당신은 outputImage.extent를 사용합니다. outputImage extent .....를 사용하고 outputImage.extent에 오류가 발생했습니다. –

+0

오류가 발생하지 않았습니다. [출력 범위]는 같은 것을 의미합니다. – neeraj