2016-05-10 6 views
1

Hallo Ich möchte Zoom-Funktionalität in der Kamera mit GPUImage einstellen. Ich habe es getan. Aber wenn ich das Bild von der Kamera mit dem Zoom aufnehmen und das Bild in der Bildergalerie gespeichert sehe, habe ich festgestellt, dass das Bild normal gespeichert wird (kein Zoomen gefunden). Ich möchte in welchem ​​Modus ich ein Bild aufnehmen, das im Album gespeichert werden muss. Wie kann ich dieses Problem lösen? Jeder Vorschlag wird großartig sein. Danke Leute. Mein Code:iOS: Wie wird das gezoomte Caputre-Bild von der Kamera mit GPUImage gespeichert?

- (void)viewDidLoad { 
[super viewDidLoad]; 
self.library = [[ALAssetsLibrary alloc] init]; 
[self setViewLayOut]; 
[self setupFilter]; 
[self setZoomFunctionlityOnCamera]; 

} 

- (void)setupFilter; 
{ 
videoCamera = [[GPUImageStillCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraPosition:AVCaptureDevicePositionBack]; 
videoCamera.outputImageOrientation = UIInterfaceOrientationPortrait; 
switch (filterType) 
{ 
    case GPUIMAGE_COLORINVERT: 
    { 
     self.title = @"Color Negative"; 
     filter = [[GPUImageColorInvertFilter alloc] init]; 
    }; 
    break; 
    case GPUIMAGE_GRAYSCALE: 
    { 
     self.title = @"Black and White Positive"; 
     filter = [[GPUImageGrayscaleFilter alloc] init]; 
    }; 
    break; 

    default: filter = [[GPUImageFilter alloc] init]; 
    self.title = @"Color Positive"; 
    break; 
} 
videoCamera.runBenchmark = YES; 
filterView = (GPUImageView *)cameraView; 

[filter addTarget:filterView]; 
[videoCamera addTarget:filter]; 
[videoCamera startCameraCapture]; 
} 



-(void)setZoomFunctionlityOnCamera 
{  
    UIPinchGestureRecognizer *pinchRecognizer = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinchDetected:)]; 
[self.view addGestureRecognizer:pinchRecognizer]; 
pinchRecognizer.delegate = self; 
} 

- (void)pinchDetected:(UIPinchGestureRecognizer *)pinchRecognizer 
{ 
if([gestureRecognizer state] == UIGestureRecognizerStateBegan) { 
    // Reset the last scale, necessary if there are multiple objects with different scales 
    lastScale = [gestureRecognizer scale]; 
} 

if ([gestureRecognizer state] == UIGestureRecognizerStateBegan || 
    [gestureRecognizer state] == UIGestureRecognizerStateChanged) { 

    CGFloat currentScale = [[[gestureRecognizer view].layer valueForKeyPath:@"transform.scale"] floatValue]; 

    // Constants to adjust the max/min values of zoom 
    const CGFloat kMaxScale = 5.0; 
    const CGFloat kMinScale = 1.0; 

    CGFloat newScale = 1 - (lastScale - [gestureRecognizer scale]); // new scale is in the range (0-1) 
    newScale = MIN(newScale, kMaxScale/currentScale); 
    newScale = MAX(newScale, kMinScale/currentScale); 
    CGAffineTransform transform = CGAffineTransformScale([[gestureRecognizer view] transform], newScale, newScale); 
    [gestureRecognizer view].transform = transform; 

    lastScale = [gestureRecognizer scale]; 
} 



- (IBAction)clickPhotoBtn:(id)sender { 
if (!isCameraPermissionAccessed) { 
    [self showAccessDeinedMessage :@"Camera permission denied" withMessage:@"To enable, please go to settings and allow camera permission for this app."]; 
    return; 
} 
[videoCamera capturePhotoAsJPEGProcessedUpToFilter:filter withCompletionHandler:^(NSData *processedJPEG, NSError *error){ 
    if (error!=nil) 
    { 
     [self showErrorMessage:@"Unable to capture image" ]; 
     return ; 
    } 

    else { 
    UIImage *image = [UIImage imageWithData:processedJPEG]; 
    if (filterType == GPUIMAGE_GRAYSCALE) { 
     GPUImagePicture *stillImageSource = [[GPUImagePicture alloc] initWithImage:image]; 
     GPUImageColorInvertFilter *stillImageFilter = [[GPUImageColorInvertFilter alloc] init]; 
     [stillImageSource addTarget:stillImageFilter]; 
     [stillImageFilter useNextFrameForImageCapture]; 
     [stillImageSource processImage]; 
     UIImage *currentFilteredVideoFrame = [stillImageFilter imageFromCurrentFramebuffer]; 
     UIImageWriteToSavedPhotosAlbum(currentFilteredVideoFrame, 
             nil, 
             nil, 
             nil); 
    } 
    else{ 
     UIImageWriteToSavedPhotosAlbum(image, 
             nil, 
             nil, 
             nil); 
    } 

     NSString *message = @"Image saved"; 
     UIAlertView *toast = [[UIAlertView alloc] initWithTitle:nil 
                 message:message 
                 delegate:nil 
               cancelButtonTitle:nil 
               otherButtonTitles:nil, nil]; 
     [toast show]; 
     int duration = 1; 
     dispatch_after(dispatch_time(DISPATCH_TIME_NOW, duration * NSEC_PER_SEC), dispatch_get_main_queue(), ^{ 
      [toast dismissWithClickedButtonIndex:0 animated:YES]; 
     }); 
    } 

}]; }

+0

Hallo, Sie eine Lösung gefunden? – Jameltheone

Antwort

0

In Ihrem Code verwenden Sie Transfrom, um Zoom-Effekt zu erzielen. Aber, transformieren, wirkt sich eigentlich nicht auf das tatsächlich aufgenommene Bild aus. Es betrifft nur GPUImageView Form. Wenn Sie ein zugeschnittenes Bild erhalten möchten, verwenden Sie stattdessen GPUImageCropFilter.

0

Verwenden GPUImageTransformFilter Zoom-Effekt anzuwenden und dann Bild erfassen zwei unten Funktionen:

[transformFilter useNextFrameForImageCapture]; 
UIImage *capturedImage = [transformFilter imageFromCurrentFramebuffer]; 
// then save captured image to photo album 
Verwandte Themen