2011-12-13 11 views
7

Jestem nowicjuszem dla iOS i walczyłem o ścianę, szukając tego w zeszłym tygodniu, szukając w Internecie tutoriali takich jak: Dealing with Exif Images, Resizing images, i wielu więcej losowych pytań tutaj na StackOverflow. Z tego wywnioskowałem, że wszystkie obrazy zrobione z kamery zawierają informacje o rotacji oparte na EXIF.iOS: Kadrowanie obrazu nieruchomego pobranego z kamery UIImagePickerController z nakładką

Co nie działa: Po wypróbowaniu różnych technik kadrowanie obrazu, wszystko skończyć z jest kadrowanie obrazu w niektórych losowych narożników, a także, powstały obraz wydaje się być powiększony :(Kiedy używam png wizerunek z Internetu (które nie zawierają danych EXIF), przycinanie działa, przez przypadkowe rogi, mam na myśli - obraz kończy się obcięcie w prawym górnym i lewym górnym rogu i powiększenie obrazu.

Co próbuję wykonać: Próbuję przyciąć obraz 100 px od góry i 100 px od dołu. Zasadniczo używam dwóch nakładek - 1 u góry i 1 u dołu z wysokim pasem na górze] i innym CGRect(0.0, SCREEN_HEIGHT - 100, SCREEN_WIDTH, 100.0) [innym 100 px wysokim paskiem u dołu]. Muszę uzyskać obraz między tymi dwoma paskami: Zakładam, że wysokość obrazu to: SCREEN_HEIGHT - 200.0.

Wyświetlanie UIImagePickerController dla kamery z nakładką:

 

    //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]; 
 

Kodeksu aby obrócić obraz na podstawie EXIF ​​imageOrientation nieruchomości i przycinanie jej

 

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

 

Sposób cropImage wydaje się działać dla obrazów pobranych z internetu (które nie zawierają żadnych informacji o orientacji). Kończą mi się opcje. Czy ktoś mógłby mi pomóc?

Dzięki za przeczytanie!

+0

Sagar - czy poniższa metoda nie powoduje aplikacja do upadku? – Dejell

+0

@Odelya do której z poniższych metod się odwołujesz? –

+0

Odpowiedź od Matt. Mam dokładny problem i przez miesiąc nie udało mi się go prawidłowo przyciąć. – Dejell

Odpowiedz

17

Kiedy można, łatwiej jest przejść z obrazów rysunkowych rdzeń graficzny:

- (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 Dzięki, Matt. Próba zrozumienia kodu: Linia nr 2 "wybiera" obraz z przyciętym dolnym 200 px, a następnie umieszcza nowe obrazy 100 px w górę w stosunku do oryginalnego obrazu, przycinając w ten sposób górny 100 pikseli i dolny 100 pikseli w prawo? To zadziałało dla mnie! Wielkie dzięki za twoje wysiłki !! Chociaż przycięty obraz nie jest dokładnie taki, jak ten z nakładką kamery, ale prawdopodobnie będę musiał poprawić ustawienia nosków. trochę. BTW, ten kod nie jest bezpieczny dla wątków, prawda? I domyślam się, że biblioteka CG zapewnia sposób bezpieczny dla wątków - więc byłoby wspaniale używać go w sposób bezpieczny dla wątków. –

+1

Jest bezpieczny dla wątków w systemie iOS 4.0 i nowszych wersjach, [QA 1637] (http://developer.apple.com/library/ios/#qa/qa1637/_index.html). – Mats

+0

+1, Zaakceptowany! Wspaniale, to działa wtedy - pięknie! DZIĘKUJĘ TON! Bardzo doceniane! –

Powiązane problemy