2012-04-12 86 views
1

在Ray Wenderlich的網站上關注了tutorial,我決定嘗試操縱我學到的知識並將其應用於CITransition,特別是CIDissolveTransition。然而,即使在交叉引用了我對蘋果公司自己的過濾器文檔(我認爲,這些文檔已經過時,難以置信地難以適應他們自己錯綜複雜的例子)之後,我似乎無法看到圖像出現。這是我到目前爲止:如何在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:的調用正在返回nil,因爲iOS不知道如何製作CIDossolveTransition過濾器。 Core Image for iOS不支持Core image for Mac OS的所有過濾器。見this answer

您可以閱讀Apple's Core image Filter參考,看看哪些過濾器在iOS的支持,但壞消息是,過渡沒有獲得晉級爲iOS 5在iOS 5中唯一可用的過濾器,用合成涉及的CISourceOverCompositing ,這對你來說可能不是很有趣。

+0

哦,夥計。不能相信我錯過了這一點。這只是給這個項目增加了一個很大的障礙。我假設我的下一個最佳解決方案是手動操作我的圖像的像素數據。這看起來很具挑戰性。謝謝您的幫助! – MyNameIsKo 2012-04-13 16:18:33

+0

這不再是事實。文檔目前聲明「適用於OS X v10.4及更高版本以及iOS 6.0及更高版本。」 – zot 2016-10-02 02:36:19

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至10個200×200的圖像時,循環運行在模擬器相當順利。我想通過事先提取圖像像素數據可能會更高效。

相關問題