2010-11-22 15 views
4

Ich benutze UIImagePickerController, um Fotos auf dem iPhone zu machen. Ich möchte das Foto im laufenden Betrieb anpassen. Es sieht so aus, als könnte ich mit UIImagePickerController die Form des Fotos im laufenden Betrieb anpassen, aber ich finde keine Möglichkeit, die Farbe im laufenden Betrieb zu ändern. Ändern Sie beispielsweise die gesamte Farbe in Schwarz/Weiß.Wie ändert man die Pixelfarbe im Vorschaufenster der iPhone-Kamera?

Danke.

Antwort

4

Der beste Weg, dies zu tun ist mit einem AVCaptureSession-Objekt. Ich mache genau, was du redest in meiner kostenlosen App "Live Effects Cam"

Es gibt mehrere Code-Beispiele online, die Ihnen helfen werden, dies auch zu implementieren. Hier ist ein Beispiel Codeabschnitt, der helfen könnte:

- (void) activateCameraFeed 
    { 
    videoSettings = nil; 

#if USE_32BGRA 
    pixelFormatCode = [[NSNumber alloc] initWithUnsignedInt:(unsigned int)kCVPixelFormatType_32BGRA]; 
    pixelFormatKey = [[NSString alloc] initWithString:(NSString *)kCVPixelBufferPixelFormatTypeKey]; 
    videoSettings = [[NSDictionary alloc] initWithObjectsAndKeys:pixelFormatCode, pixelFormatKey, nil]; 
#endif 

    videoDataOutputQueue = dispatch_queue_create("com.jellyfilledstudios.ImageCaptureQueue", NULL); 

    captureVideoOutput = [[AVCaptureVideoDataOutput alloc] init]; 
    [captureVideoOutput setAlwaysDiscardsLateVideoFrames:YES]; 
    [captureVideoOutput setSampleBufferDelegate:self queue:videoDataOutputQueue]; 
    [captureVideoOutput setVideoSettings:videoSettings]; 
    [captureVideoOutput setMinFrameDuration:kCMTimeZero]; 

    dispatch_release(videoDataOutputQueue); // AVCaptureVideoDataOutput uses dispatch_retain() & dispatch_release() so we can dispatch_release() our reference now 

    if (useFrontCamera) 
     { 
     currentCameraDeviceIndex = frontCameraDeviceIndex; 
     cameraImageOrientation = UIImageOrientationLeftMirrored; 
     } 
    else 
     { 
     currentCameraDeviceIndex = backCameraDeviceIndex; 
     cameraImageOrientation = UIImageOrientationRight; 
     } 

    selectedCamera = [[AVCaptureDevice devices] objectAtIndex:(NSUInteger)currentCameraDeviceIndex]; 

    captureVideoInput = [AVCaptureDeviceInput deviceInputWithDevice:selectedCamera error:nil]; 

    captureSession = [[AVCaptureSession alloc] init]; 

    [captureSession beginConfiguration]; 

    [self setCaptureConfiguration]; 

    [captureSession addInput:captureVideoInput]; 
    [captureSession addOutput:captureVideoOutput]; 
    [captureSession commitConfiguration]; 
    [captureSession startRunning]; 
    } 


// AVCaptureVideoDataOutputSampleBufferDelegate 
// AVCaptureAudioDataOutputSampleBufferDelegate 
// 
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection 
    { 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

    if (captureOutput==captureVideoOutput) 
     { 
     [self performImageCaptureFrom:sampleBuffer fromConnection:connection]; 
     } 

    [pool drain]; 
    } 



- (void) performImageCaptureFrom:(CMSampleBufferRef)sampleBuffer 
    { 
    CVImageBufferRef imageBuffer; 

    if (CMSampleBufferGetNumSamples(sampleBuffer) != 1) 
     return; 
    if (!CMSampleBufferIsValid(sampleBuffer)) 
     return; 
    if (!CMSampleBufferDataIsReady(sampleBuffer)) 
     return; 

    imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer); 

    if (CVPixelBufferGetPixelFormatType(imageBuffer) != kCVPixelFormatType_32BGRA) 
     return; 

    CVPixelBufferLockBaseAddress(imageBuffer,0); 

    uint8_t *baseAddress = (uint8_t *)CVPixelBufferGetBaseAddress(imageBuffer); 
    size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer); 
    size_t width = CVPixelBufferGetWidth(imageBuffer); 
    size_t height = CVPixelBufferGetHeight(imageBuffer); 
    int bufferSize = bytesPerRow * height; 

    uint8_t *tempAddress = malloc(bufferSize); 
    memcpy(tempAddress, baseAddress, bytesPerRow * height); 

    baseAddress = tempAddress; 

    // 
    // Apply affects to the pixels stored in (uint32_t *)baseAddress 
    // 
    // 
    // example: grayScale((uint32_t *)baseAddress, width, height); 
    // example: sepia((uint32_t *)baseAddress, width, height); 
    // 

    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
    CGContextRef newContext = nil; 

    if (cameraDeviceSetting != CameraDeviceSetting640x480)  // not an iPhone4 or iTouch 5th gen 
     newContext = CGBitmapContextCreate(baseAddress, width, height, 8, bytesPerRow, colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaNoneSkipFirst); 
    else 
     newContext = CGBitmapContextCreate(baseAddress, width, height, 8, bytesPerRow, colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst); 

    CGImageRef newImage = CGBitmapContextCreateImage(newContext); 
    CGColorSpaceRelease(colorSpace); 
    CGContextRelease(newContext); 

    free(tempAddress); 

    CVPixelBufferUnlockBaseAddress(imageBuffer,0); 

    if (newImage == nil) 
     { 
     return; 
     } 

    // To be able to display the CGImageRef newImage in your UI you will need to do it like this 
    // because you are running on a different thread here… 
    // 
    [self performSelectorOnMainThread:@selector(newCameraImageNotification:) withObject:(id)newImage waitUntilDone:YES]; 
    } 
+0

Ich habe versucht, Ihre Live-Effekte Cam, es sieht gut aus, und es hat viel mehr Features, die ich versuchte zu implementieren. Gut gemacht! Ich bin nur überrascht, dass es kostenlos ist. – BlueDolphin

+0

Danke. Ich bekomme unter 50 Downloads pro Tag, wenn es 99 Cent und durchschnittlich über 1500 Downloads pro Tag ist, wenn es kostenlos ist. Ich gebe ein Update heraus, das den App-Kauf für die gefragtesten der neuen Funktionen beinhaltet. Ich empfehle die kostenlose App mit In-App-Kauf-Ansatz für jeden, der heute eine neue App entwickelt. –

1

Sie können eine Ansicht über das Bild einblenden und den Füllmodus ändern, um einen Schwarz/Weiß-Effekt zu erzielen.

Schauen Sie sich die QuartzDemo von Apple, speziell in dieser Demo, das Blending Modes Beispiel

1

Ein anderer Weg, dies zu tun wäre, um jeden Rahmen zu konvertieren AVFoundation verwenden. Ich habe nicht viel Erfahrung damit, aber das Video "Session 409 - Verwenden der Kamera mit AVFoundation" von WWDC2010 und seinen Beispielprojekten sollte Ihnen bei Ihrem Problem viel helfen.

Das ist natürlich, wenn Sie mit iOS4-Klassen in Ordnung sind.

Verwandte Themen