2016-05-10 7 views
1

こんにちは私はGPUImageでカメラにズーム機能を設定したいと思います。私はそれをやった。しかし、私はズームでカメラから画像をキャプチャし、その画像を画像ギャラリーに保存してみると、画像は通常どおりに保存されることがわかりました(ズームが見つかりません)。どちらのモードでもアルバムに保存しなければならない画像をキャプチャしたい。どのように私はこの問題を解決することができます任意の提案は素晴らしいでしょう。みんなありがとう。私のコード:iOS:GPUImageでズームした画像をカメラから保存するにはどうすればいいですか?

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

こんにちは、あなたはどんな解決策を見つけましたか? – Jameltheone

答えて

0

コードでは、transfromを使用してズーム効果を実現しました。しかし、変換、実際に実際の撮影画像には何の影響もありません。これは、GPUImageViewの形状にのみ影響します。切り抜かれた画像を取得したい場合は、GPUImageCropFilterを代わりに使用してください。

0

使用GPUImageTransformFilterズーム効果を適用し、機能の下にある2つを使用して画像をキャプチャする:

[transformFilter useNextFrameForImageCapture]; 
UIImage *capturedImage = [transformFilter imageFromCurrentFramebuffer]; 
// then save captured image to photo album 
関連する問題