2012-04-12 8 views
1

Nachdem ich auf der Website von Ray Wenderlich eine tutorial verfolgt hatte, beschloss ich, zu versuchen, zu manipulieren, was ich gelernt habe, und es auf einen CIT-Übergang anzuwenden, insbesondere auf CIDissolveTransition. Allerdings kann ich das Bild nicht erscheinen lassen, selbst nachdem ich das, was ich gelernt habe, gegen die eigene Filterdokumentation von Apple verweise (was, ich muss sagen, datiert und unglaublich schwierig ist, sich außerhalb ihrer eigenen verschachtelten Beispiele anzupassen). Hier ist, was ich bisher:Wie verwende ich einen Bildübergangsfilter in 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]; 

Alles, was ich bekommen habe ist ein schwarzer Bildschirm, auf dem Mainimage anzeigt werden soll. Das ultimative Ziel ist es, eine Sequenz von Bildern mit diesem Überblendungseffekt mit einem Schieberegler (von dem ich annehme, dass es funktionieren wird) zu durchlaufen, aber ich kann dieses statische Bild nicht einmal zur Anzeige bringen. Jede Hilfe wird sehr geschätzt.

Antwort

6

Ihr Aufruf an filterWithName: keysAndValues: gibt nil zurück, weil iOS nicht weiß, wie man einen CIDossolveTransition-Filter erstellt. Core Image für iOS unterstützt nicht alle Filter, die das Core-Image für Mac OS unterstützt. Siehe this answer

Sie Apple's Core image Filter Referenz lesen und sehen, welche Filter in iOS unterstützt werden, aber die schlechte Nachricht ist, dass Übergänge nicht den Schnitt für iOS 5. Der einzige Filter in iOS 5, die mit Compositing beschäftigt gemacht hat ist CISourceOverCompositing Das ist wahrscheinlich nicht sehr interessant für dich.

+0

Oh, Mann. Ich kann nicht glauben, dass ich das verpasst habe. Das hat gerade eine ziemlich große Hürde zu diesem Projekt hinzugefügt. Ich nehme an, meine nächste beste Lösung wäre, die Pixeldaten meiner Bilder manuell zu manipulieren. Das scheint ziemlich schwierig zu sein. Danke für die Hilfe! – MyNameIsKo

+0

Das stimmt nicht mehr. Die Dokumentation besagt derzeit "Verfügbar in OS X 10.4 und höher und in iOS 6.0 und höher". – zot

0

Wie Jay in seiner Antwort erwähnt, unterstützt iOS keine Übergänge. Ich habe jedoch ein Skript gefunden und bearbeitet, das die Pixelwerte von zwei Bildern erfasst und basierend auf einem Prozentwert eine Kreuzung der beiden zurückgibt. Hier ist die Methode:

- (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; 

}

Ich habe es nicht auf einem Gerät getestet, aber es läuft ziemlich glatt auf dem Simulator, wenn sie durch 6 bis 10 200x200 Bilder Rad eines Schieberegler verwenden. Ich denke, es könnte effizienter sein, indem die Bildpixeldaten vorher extrahiert werden.

Verwandte Themen