2012-04-12 1 views
1

Ray Wenderlich의 사이트에서 성공한 tutorial을 성공적으로 따라 간 후에, 나는 배웠던 것을 조작하고 CITransition, 특히 CIDissolveTransition으로 적용하기로 결정했습니다. 그러나 Apple의 필터 문서 (내가 말했듯이, 날짜가 있고 자신의 복잡한 예제를 벗어나 적응하기가 매우 어렵다)에 대해 내가 배운 것을 상호 참조 한 후에도 이미지가 나타나지 않는 것 같습니다. 여기 내가 지금까지 가지고있는 것입니다 :Xcode에서 이미지 전환 필터는 어떻게 사용합니까?

NSURL *url = [NSURL fileURLWithPath:imagePath]; 
NSURL *url2 = [NSURL fileURLWithPath:image2Path]; 
CIContext *context; 
CIFilter *filter; 
CIImage *beginImage, *targetImage; 
UIImageView *mainImage = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 200, 200)]; 
[self addSubview:mainImage]; 

beginImage = [CIImage imageWithContentsOfURL:url]; 
targetImage = [CIImage imageWithContentsOfURL:url2]; 

if(context == nil) 
{ 
    NSLog(@"Creating Context"); 
    context = [CIContext contextWithOptions:nil]; 
} 
if(filter == nil) { 
    NSLog(@"Creating filter"); 
    filter = [CIFilter filterWithName:@"CIDissolveTransition" keysAndValues:@"inputImage", beginImage, @"inputTargetImage", targetImage, @"inputTime", [NSNumber numberWithFloat:0.5], nil]; 
} 

CIImage *outputImage = [filter outputImage]; 

CGImageRef cgimg = [context createCGImage:outputImage fromRect:[outputImage extent]]; 
UIImage *newImg = [UIImage imageWithCGImage:cgimg]; 

[mainImage setImage:newImg]; 

나는 mainImage가 표시되어야하는 검은 색 화면이 있습니다. 궁극적 인 목표는 슬라이더를 사용하여이 디졸브 효과를 사용하여 일련의 이미지를 순환 할 수있게하는 것입니다. 그러나이 정적 이미지를 표시 할 수는 없습니다. 어떤 도움이라도 대단히 감사하겠습니다.

답변

6

filterWithName에 대한 호출 : keysAndValues ​​: iOS가 CIDossolveTransition 필터를 만드는 방법을 모르기 때문에 nil을 반환합니다. iOS 용 코어 이미지는 Mac OS 용 코어 이미지에서 수행하는 모든 필터를 지원하지 않습니다. this answer

당신은 Apple's Core image Filter 참조를 읽고 아이폰 OS에서 지원되는 필터를 볼 수 있습니다 볼 수 있지만, 나쁜 소식은 전환이 아이폰 OS (5) 합성을 다루는에서 iOS 5에서 사용할 수있는 유일한 필터의 컷을하지 않았다 CISourceOverCompositing된다는 것이다 , 아마도 당신에게별로 흥미롭지 않습니다.

+0

오, 맨. 내가 그걸 놓쳤다는 것을 믿을 수 없어. 방금이 프로젝트에 큰 장애물이 추가되었습니다. 내 다음 최고의 솔루션을 내 이미지의 픽셀 데이터를 수동으로 조작 할 것이라고 가정합니다. 이것은 꽤 어려운 것 같습니다. 도와 주셔서 감사합니다! – MyNameIsKo

+0

이것은 더 이상 사실이 아닙니다. 현재 문서에는 "OS X v10.4 이상 및 iOS 6.0 이상에서 사용 가능합니다."라고 나와 있습니다. – zot

0

제이가 자신의 대답에서 언급했듯이 iOS는 전환을 지원하지 않습니다. 그러나 두 이미지의 픽셀 값을 잡고 퍼센트를 기준으로 두 이미지의 십자가를 반환하는 스크립트를 발견하고 편집했습니다. 여기 방법입니다 :

- (UIImage*)morphImage:(UIImage*)img1 
      withImage:(UIImage*)img2 
      withValue:(float)val 
{ 
CGImageRef sourceImage = img1.CGImage; 
CGImageRef sourceImage2 = img2.CGImage; 

CFDataRef theData; 
theData = CGDataProviderCopyData(CGImageGetDataProvider(sourceImage)); 
CFDataRef theData2; 
theData2 = CGDataProviderCopyData(CGImageGetDataProvider(sourceImage2)); 

UInt8 *pixelData = (UInt8 *) CFDataGetBytePtr(theData); 
UInt8 *pixelData2 = (UInt8 *) CFDataGetBytePtr(theData2); 

int dataLength = CFDataGetLength(theData); 

//color byte increments 
int red = 0; 
int green = 1; 
int blue = 2; 
//temporary rgb values for both images 
int r1, g1, b1, r2, g2, b2; 
//fake slider value 
for (int index = 0; index < dataLength; index += 4) { 
r1 = pixelData[index + red]; 
g1 = pixelData[index + green]; 
b1 = pixelData[index + blue]; 
r2 = pixelData2[index + red]; 
g2 = pixelData2[index + green]; 
b2 = pixelData2[index + blue]; 

pixelData[index + red] += (r2 - r1) * val; 
pixelData[index + green] += (g2 - g1) * val; 
pixelData[index + blue] += (b2 - b1) * val; 
} 

CGContextRef context; 
context = CGBitmapContextCreate(pixelData, 
           CGImageGetWidth(sourceImage), 
           CGImageGetHeight(sourceImage), 
           8, 
           CGImageGetBytesPerRow(sourceImage), 
           CGImageGetColorSpace(sourceImage), 
           kCGImageAlphaPremultipliedLast); 

CGImageRef newCGImage = CGBitmapContextCreateImage(context); 
UIImage *newImage = [UIImage imageWithCGImage:newCGImage]; 

CGContextRelease(context); 
CFRelease(theData); 
CGImageRelease(newCGImage); 

return newImage; 

}

나는 장치에 그것을 테스트하지 않은,하지만 슬라이더를 사용하여 6하여 200x200 (10)에 대한 이미지를 순환 할 때 시뮬레이터에 매우 부드럽게 실행됩니다. 이미지 픽셀 데이터를 미리 추출하면 더 효율적일 수 있다고 생각합니다.

1

Apple WWDC 2014 세션 "Advances in Core Image"에 iOS에서 사용할 수있는 115 개의 CIFilter가 있습니다. CIDissolveTransition은 2014 년 지원으로 나열됩니다. 세션 514를 참조하십시오. https://developer.apple.com/videos/play/wwdc2014/514/ 다시 시도하십시오!