2013-09-19 3 views
0

ОК, поэтому следующий код работает, но я не понимаю почему. Я снимаю неподвижные изображения с фронтальной камеры с помощью AVFoundation. У меня этот код перед инициирующим захвата:Странное поведение при повороте AVFoundation неподвижных изображений на iOS

if ([connection isVideoOrientationSupported]) { 
    AVCaptureVideoOrientation orientation; 

    switch ([UIDevice currentDevice].orientation) { 
     case UIDeviceOrientationPortraitUpsideDown: 
      orientation = AVCaptureVideoOrientationPortraitUpsideDown; 
      break; 
     case UIDeviceOrientationLandscapeLeft: 
      orientation = AVCaptureVideoOrientationLandscapeRight; 
      break; 
     case UIDeviceOrientationLandscapeRight: 
      orientation = AVCaptureVideoOrientationLandscapeLeft; 
      break; 
     default: 
      orientation = AVCaptureVideoOrientationPortrait; 
      break; 
    } 

    [connection setVideoOrientation:orientation]; 
} 

, а затем это в captureStillImageAsynchronouslyFromConnection:completionHandler: для хранения изображений:

NSData *imageData = [AVCaptureStillImageOutputjpegStillImageNSDataRepresentation:imageSampleBuffer]; 
UIImage *i = [UIImage imageWithData:imageData]; 
orientation:i.imageOrientation]; 

UIGraphicsBeginImageContext(i.size); 

[i drawAtPoint:CGPointMake(0.0, 0.0)]; 

image.image = UIGraphicsGetImageFromCurrentImageContext(); 

, как вы можете видеть, я не повернуть изображение или что-нибудь, просто рисовать это в контексте и сохранить. Но как только я пытаюсь использовать i, он всегда поворачивается на 90 градусов. Если я пытаюсь повернуть его с помощью

UIImage *rotated = [[UIImage alloc] initWithCGImage:i.CGImage scale:1.0f orientation:i.imageOrientation]; 

он не работает (без изменений с использованием только i).

Я понимаю, что UIImage может просто нарисовать изображение в контексте, используя правильную ориентацию автоматически, но WTF?

ответ

0

вы можете проверить ориентацию устройства, как это:

if ((deviceOrientation == UIInterfaceOrientationLandscapeLeft && position ==  AVCaptureDevicePositionBack) 
                    ) 
                  { 

и если выше условия или что-то ваше состояние удовлетворяет, то вы можете вращать изображение, используя код ниже:

-(void)rotateImageByDegress:(int)degrees{ 
if (degrees == 0.0) { 
    return self; 
} 
// calculate the size of the rotated view's containing box for our drawing space 
UIView *rotatedViewBox = [[UIView alloc] initWithFrame:CGRectMake(0,0,self.size.width, self.size.height)]; 
CGAffineTransform t = CGAffineTransformMakeRotation(DegreesToRadians(degrees)); 
rotatedViewBox.transform = t; 
CGSize rotatedSize = rotatedViewBox.frame.size; 
[rotatedViewBox release]; 

// Create the bitmap context 
UIGraphicsBeginImageContext(rotatedSize); 
CGContextRef bitmap = UIGraphicsGetCurrentContext(); 

// Move the origin to the middle of the image so we will rotate and scale around the center. 
CGContextTranslateCTM(bitmap, rotatedSize.width/2, rotatedSize.height/2); 

// // Rotate the image context 
CGContextRotateCTM(bitmap, DegreesToRadians(degrees)); 

// Now, draw the rotated/scaled image into the context 
CGContextScaleCTM(bitmap, 1.0, -1.0); 
CGContextDrawImage(bitmap, CGRectMake(-self.size.width/2, -self.size.height/2, self.size.width, self.size.height), [self CGImage]); 

UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
return newImage; 

}

+0

Спасибо, но, как я уже сказал, мой код работает для каждой ориентации, просто потому, что я точно не понимаю почему. – mirosval

 Смежные вопросы

  • Нет связанных вопросов^_^