2011-12-13 3 views
7

저는 iOS에 익숙하지 않습니다. 지난 주에 온라인으로 둘러보기 : Dealing with Exif Images, Resizing images 및 그 외 많은 자습서를 볼 수 있습니다. 더 많은 무작위 질문 StackOverflow 여기에 있습니다. 여기에서 나는 >=iOS 4.0이라고 생각하고 카메라에서 가져온 모든 이미지에는 EXIF 기반 회전 정보가 포함되어 있습니다. 무엇 작동하지 않습니다iOS : 오버레이로 UIImagePickerController 카메라에서 캡처 한 정지 이미지 자르기

: 모든 나는 또한 어떤 임의의 모서리에서 이미지 자르기하고 끝낼를 다른 이미지 자르기 기법을 시도 후에는, 결과 이미지는 내가 png 이미지를 사용하는 경우에 :(확대 할 것으로 보인다 인터넷에서 (EXIF 데이터가없는) 자르기가 작동하고 있습니다. 임의의 모서리로 말하면 이미지의 오른쪽 상단/왼쪽 상단이 잘리고 확대 된 이미지가 끝납니다.

내가 이루고자하는 바 :
위로부터 이미지 100 px, 아래에서 100 px 이미지를 자르려고합니다. 본질적으로, 상단에 1 개, 하단에 1 개, 상단에 높이가[100.0 px]이고 다른 하나는 CGRect(0.0, SCREEN_HEIGHT - 100, SCREEN_WIDTH, 100.0) [하단에 다른 100 px 높이 스트립]이라는 두 개의 오버레이 스트립을 사용하고 있습니다. 이 두 스트립 사이에 이미지를 가져와야합니다. 이미지 높이가 SCREEN_HEIGHT - 200.0이라고 가정합니다. EXIF imageOrientation 속성을 기준으로 이미지를 회전

 

    //SCREEN_HEIGHT = 480 and SCREEN_WIDTH = 320 
    UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init]; 

    if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera] == NO) 
    { 
     NSLog(@"Camera not available"); 
     return; 
    } 

    imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera; 
    imagePicker.delegate = self; 
    imagePicker.allowsEditing = NO; 


    // Hide the controls 
    imagePicker.showsCameraControls = NO; 
    imagePicker.navigationBarHidden = YES; 

    // Make camera view full screen 
    imagePicker.wantsFullScreenLayout = YES; 
    //imagePicker.cameraViewTransform = CGAffineTransformScale(imagePicker.cameraViewTransform, CAMERA_TRANSFORM_X, CAMERA_TRANSFORM_Y); 


    //Overlay 
    //OverlayView is a plain UIView with the CGRects mentioned in the question. 
    OverlayView *overlay = [[OverlayView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)]; 
    [overlay initOverlay:self]; 
    imagePicker.cameraOverlayView = overlay; 
    [self presentModalViewController:imagePicker animated:YES]; 
 

코드 및 그것에게 cropImage 방법은 다운로드 한 이미지를 작동하는 것 같다

 

- (UIImage *) cropImage: (UIImage *) originalImage 
{ 

    CGRect cropRect = CGRectMake(0, 100.0, SCREEN_WIDTH, SCREEN_HEIGHT - 100); 

    CGRect transformedRect = [self TransformCGRectForUIImageOrientation:cropRect :originalImage.imageOrientation :originalImage.size]; 

    CGImageRef resultImageRef = CGImageCreateWithImageInRect(originalImage.CGImage, transformedRect); 

    UIImage *newImage = [[[UIImage alloc] initWithCGImage:resultImageRef scale:1.0 orientation:originalImage.imageOrientation] autorelease]; 

    return newImage; 
} 

- (CGRect) TransformCGRectForUIImageOrientation: (CGRect) source: (UIImageOrientation) orientation: (CGSize) imageSize { 

    switch (orientation) { 
     case UIImageOrientationLeft: { // EXIF #8 
      CGAffineTransform txTranslate = CGAffineTransformMakeTranslation(
                      imageSize.height, 0.0); 
      CGAffineTransform txCompound = CGAffineTransformRotate(txTranslate, 
                    M_PI_2); 
      return CGRectApplyAffineTransform(source, txCompound); 
     } 
     case UIImageOrientationDown: { // EXIF #3 
      CGAffineTransform txTranslate = CGAffineTransformMakeTranslation(
                      imageSize.width, imageSize.height); 
      CGAffineTransform txCompound = CGAffineTransformRotate(txTranslate, 
                    M_PI); 
      return CGRectApplyAffineTransform(source, txCompound); 
     } 
     case UIImageOrientationRight: { // EXIF #6 
      CGAffineTransform txTranslate = CGAffineTransformMakeTranslation(
                      0.0, imageSize.width); 
      CGAffineTransform txCompound = CGAffineTransformRotate(txTranslate, 
                    M_PI + M_PI_2); 
      return CGRectApplyAffineTransform(source, txCompound); 
     } 
     case UIImageOrientationUp: // EXIF #1 - do nothing 
     default: // EXIF 2,4,5,7 - ignore 
      return source; 
    } 

 

자르기 : 오버레이 카메라 UIImagePickerController를 표시

(방향 정보가 포함되어 있지 않은) 인터넷에서. 옵션이 부족합니다. 누군가 나를 도와 주실 수 있습니까?

읽어 주셔서 감사합니다.

+0

사가르 - 아래의 방법은 앱이 붕괴 발생하지 않았습니까? – Dejell

+0

아래의 방법을 사용하고있는 @Odelya를 추천하고 있습니까? –

+0

매트의 답변입니다. 나는 정확한 문제가있어 이미지를 제대로 자르지 못한 한 달 동안 성공하지 못했습니다. – Dejell

답변

17

당신이 할 수있는, 핵심 그래픽 드로잉 이미지를 생략하는 것이 더 쉽습니다 :

- (UIImage *)cropImage:(UIImage *)oldImage { 
    CGSize imageSize = oldImage.size 
    UIGraphicsBeginImageContextWithOptions(CGSizeMake(imageSize.width, 
                 imageSize.height - 200), 
              NO, 
              0.); 
    [oldImage drawAtPoint:CGPointMake(0, -100) 
       blendMode:kCGBlendModeCopy 
        alpha:1.]; 
    UIImage *croppedImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    return croppedImage; 
} 
+0

+1 감사합니다, Matt. 코드를 이해하려고 시도합니다. 2 번 줄은 200px로 잘린 이미지를 "선택"한 다음 원본 이미지의 100px 위쪽으로 새로운 이미지를 배치하여 상위 100px 및 아래쪽 100px를 잘라냅니다. 그것은 나를 위해 일했다! 당신의 노력에 감사드립니다! 클리핑 된 이미지가 카메라 오버레이에서 본 이미지와 정확히 같지는 않지만 실제로는 nos를 조정해야합니다. 약간. BTW,이 코드는 스레드로부터 안전하지 않습니까? 그리고 CG lib는 이것을하기위한 thread-safe 방법을 제공합니다 - 그래서 thread-safe 방식으로 사용하는 것이 좋을 것입니다. –

+1

iOS 4.0 이상, [QA 1637] (http://developer.apple.com/library/ios/#qa/qa1637/_index.html)에서는 스레드로부터 안전합니다. – Mats

+0

+1, 허용! 멋지다,이 작품은 - 아름답게! 엄청 고마워! 매우 감사! –

관련 문제