2010-05-18 4 views
4

Я запускаю приложение в ландшафтном режиме. Что нужно сделать, чтобы снятый снимок был также в ландшафтном режиме.iPhone screen shot in landscape view

Я использую следующий код в приложении iphone с вкладкой внизу и снимаю снимок экрана, но всегда в портретном режиме. Зачем?

UIWindow *screenWindow = [[UIApplication sharedApplication] keyWindow]; 

UIGraphicsBeginImageContext(screenWindow.frame.size); 
[screenWindow.layer renderInContext:UIGraphicsGetCurrentContext()]; 
UIImage *screenshot = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

ответ

2

Мой предыдущий ответ был некорректным. Я работал над этим, и у меня есть ответ на правый снимок экрана. Это позволит сэкономить правый правый снимок экрана в рулоне камеры. Я не пробовал пейзаж.

Это вариант ответа, предоставленного в другом вопросе о стеке here. Проблема с этим ответом заключается в том, что на экране всегда есть изображениеОриентирование (только для чтения) UIImageOrientationUp. Поэтому мы должны знать, какова была ориентация и соответствующим образом изменить ее.

Надеюсь, это поможет. Если это работает на ландшафте слева или вы получаете вариацию, которая работает на левой стороне, пожалуйста, опубликуйте ее.

- (IBAction)cameraButtonClick:(id)sender { 

    UIWindow *screenWindow = [[UIApplication sharedApplication] keyWindow]; 

    UIGraphicsBeginImageContext(screenWindow.frame.size); 
    [screenWindow.layer renderInContext:UIGraphicsGetCurrentContext()]; 

    UIImage *screenshot = UIGraphicsGetImageFromCurrentImageContext(); 


UIImageWriteToSavedPhotosAlbum([self scaleAndRotateImage:screenshot], nil, nil, nil); 

    UIGraphicsEndImageContext(); 
} 

// Code from: http://discussions.apple.com/thread.jspa?messageID=7949889 
- (UIImage *)scaleAndRotateImage:(UIImage *)image { 
    int kMaxResolution = 640; // Or whatever 

    CGImageRef imgRef = image.CGImage; 

    CGFloat width = CGImageGetWidth(imgRef); 
    CGFloat height = CGImageGetHeight(imgRef); 


    CGAffineTransform transform = CGAffineTransformIdentity; 
    CGRect bounds = CGRectMake(0, 0, width, height); 
    if (width > kMaxResolution || height > kMaxResolution) { 
     CGFloat ratio = width/height; 
     if (ratio > 1) { 
      bounds.size.width = kMaxResolution; 
      bounds.size.height = roundf(bounds.size.width/ratio); 
     } 
     else { 
      bounds.size.height = kMaxResolution; 
      bounds.size.width = roundf(bounds.size.height * ratio); 
     } 
    } 

    CGFloat scaleRatio = bounds.size.width/width; 
    CGSize imageSize = CGSizeMake(CGImageGetWidth(imgRef), CGImageGetHeight(imgRef)); 
    CGFloat boundHeight; 

    boundHeight = bounds.size.height; 
    bounds.size.height = bounds.size.width; 
    bounds.size.width = boundHeight; 
    transform = CGAffineTransformMakeTranslation(imageSize.height, imageSize.width/2.0); 
    transform = CGAffineTransformRotate(transform, M_PI/2.0); 

    UIGraphicsBeginImageContext(bounds.size); 

    CGContextRef context = UIGraphicsGetCurrentContext(); 

    UIImageOrientation orient = image.imageOrientation; 

    if (orient == UIImageOrientationRight || orient == UIImageOrientationLeft) { 
     CGContextScaleCTM(context, -scaleRatio, scaleRatio); 
     CGContextTranslateCTM(context, -height, 0); 
    } 
    else { 
     CGContextScaleCTM(context, scaleRatio, -scaleRatio); 
     CGContextTranslateCTM(context, 0, -height); 
    } 

    CGContextConcatCTM(context, transform); 

    CGContextDrawImage(UIGraphicsGetCurrentContext(), CGRectMake(0, 0, width, height), imgRef); 
    UIImage *imageCopy = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    return imageCopy; 
} 
+0

Я попробовал, что, как хорошо, и это не сработало – Satyam

+1

Satyman, сделали эту обновленную работу ответа для вас? или вы пошли в другом направлении? – dredful

1

Это действительно старая тема, но вот как это сделать в настоящее время, если у кого-то тоже есть эта проблема.

UIWindow *keyWindow = [[UIApplication sharedApplication] keyWindow]; 

CGRect rect = [keyWindow bounds]; 
UIGraphicsBeginImageContext(rect.size); 

CGContextRef context = UIGraphicsGetCurrentContext(); 
[keyWindow.layer renderInContext:context]; 

UIImage * image = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

return [[UIImage alloc] initWithCGImage:[image CGImage] scale:1 orientation:UIImageOrientationLeft]; 

Если вы хотите повернуты вправо, просто замените UIImageOrientationLeft с UIImageOrientationRight

+0

Полезный ответ. Спасибо. – Vignesh