2013-04-22 73 views
3

對於我正在開發的應用程序,我讓用戶指定他們想要在相機上捕捉的對象的尺寸(例如30「x 40」)。接下來我想要做的是在相機上顯示一個cameraOverlayView,它只顯示一個撫摸透明的正方形,它具有正確的比例來捕捉該物體。從相機中剪下預定義的一張照片

所以,我想兩件事情得到這個工作:

使用它使用AVCaptureVideoPreviewLayer顯示與現場視頻饋送視圖一個UIViewController。在該提要之上,我顯示一個透明視圖,該視圖用正確的尺寸繪製一個正方形(使用用戶指定的比例)。

在另一種嘗試中,我創建一個UIViewController,含有一個按鈕,彈出UIImagePickerController。使用這個控制器,我還創建了一個視圖,我使用cameraOverlayView屬性附加到選取器。

我對這兩種方法的主要問題是,實際拍攝的圖像總是比我在屏幕上看到的圖像大,但我不完全確定如何切割出圖像後的照片已被拍攝。

因此,例如: 我的UIImagePickerController顯示,我把一個覆蓋,顯示一個300 x 400px大的正方形。用戶使用這個方塊拍攝他們的物體的照片,並將它們的物體置於這個方塊內。

的拍攝照片,但不是照片是小320x480(或640×960),我得到的結果是3500x2400(或類似的東西。這是一個完全不同的比率,則屏幕比例(當然)。

我怎麼然後確保我切出的圖像的右側部分。

實際計算應顯示(而且應該被用來確定應該是什麼樣件圖片的平方大小的代碼剪下):

+ (CGRect) getFrameRect:(CGRect) rect forSize:(CGSize) frameSize { 
    if (CGSizeEqualToSize(frameSize, CGSizeZero)) 
     return CGRectZero; 

    float maxWidth = rect.size.width - 20; 
    float maxHeight = rect.size.height - 20; 

    float ratioX = maxWidth/frameSize.width; 
    float ratioY = maxHeight/frameSize.height; 
    float ratio = MIN(ratioX, ratioY); 

    float newWidth = frameSize.width * ratio; 
    float newHeight = frameSize.height * ratio; 

    float x = (rect.size.width - newWidth)/2; 
    float y = (rect.size.height - newHeight)/2; 

    return CGRectMake(x, y, newWidth, newHeight); 
} 

這決定了可以使用frameSize參數中指定的比率創建的最大正方形,其中應在rect參數中提供正方形的尺寸。

一些解決方案浮現在腦海,但我不確定這是否可行。

  • 將照片縮小到屏幕寬度或高度(無論先出現哪個),以圖片的中心爲準,這與拍攝照片時顯示的中心相同?不知道這會起作用,我試了一下,但失敗了。

回答

3

好吧,我找到了解決辦法:

當你正在使用相機拍攝照片,預覽屏幕只顯示你正在服用的照片的一部分。

當您的iOS設備處於肖像模式時,照片高度將縮小到屏幕高度,並且只顯示中間的640像素。

enter image description here

的暗紅色部分是什麼是顯示在屏幕上。因此,當您拍攝照片時,您需要將圖像縮小到屏幕的最大高度以獲得正確的寬度。

之後,我切出中間640x960像素,以實際獲得與拍攝照片時所顯示的相同的圖像。

之後,我的矩形覆蓋圖的座標與我的覆蓋圖的座標相同。

- (void) imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { 
    [picker dismissModalViewControllerAnimated:YES]; 

    UIImage* artImage = [info objectForKey:UIImagePickerControllerOriginalImage]; 


    CGFloat imageHeightRatio = artImage.size.height/960; 
    CGFloat imageWidth = artImage.size.width/imageHeightRatio; 

    CGSize newImageSize = CGSizeMake(imageWidth, 960); 
    artImage = [artImage imageByScalingProportionallyToSize:newImageSize]; 

    CGRect cutOutRect = CGRectMake((artImage.size.width/2) - (640/2), 0, 640, 960); 

    artImage = [self imageByCropping:artImage toRect:cutOutRect]; 

    CGRect imageCutRect = [FrameSizeCalculations getFrameRect:CGRectMake(0,0, artImage.size.width, artImage.size.height) forSize:self.frameSize]; 
    artImage = [self imageByCropping:artImage toRect:imageCutRect]; 

    CGRect imageViewRect = CGRectInset(_containmentView.bounds, 10, 10); 

    NSLog(@"ContainmentView: %f x %f x %f x %f", 
      _containmentView.frame.origin.x, 
      _containmentView.frame.origin.y, 
      _containmentView.frame.size.width, 
      _containmentView.frame.size.height 
     ); 

    NSLog(@"imageViewRect: %f x %f x %f x %f", 
      imageViewRect.origin.x, 
      imageViewRect.origin.y, 
      imageViewRect.size.width, 
      imageViewRect.size.height 
     ); 

    _imageView.frame = [FrameSizeCalculations getFrameRect:imageViewRect forSize:self.frameSize]; 

    NSLog(@"imageViewRect: %f x %f x %f x %f", 
      _imageView.frame.origin.x, 
      _imageView.frame.origin.y, 
      _imageView.frame.size.width, 
      _imageView.frame.size.height 
     ); 

    _imageView.contentMode = UIViewContentModeScaleAspectFill; 
    _imageView.image = artImage; 
} 
相關問題