2013-02-10 4 views
0

я принимаю скриншот моего экрана IPad 3 следующим образом:Принимая скриншот высокого качества прошивки

UIGraphicsBeginImageContext(self.view.frame.size); 
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()]; 
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, 
                NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 

int num = arc4random() % 100000000000000; 

NSString* path = [documentsDirectory stringByAppendingPathComponent: [NSString stringWithFormat:@"%dtest.png", num]]; 
NSData* data = UIImagePNGRepresentation(viewImage); 
[data writeToFile:path atomically:YES]; 

Проблема заключается в том, что у меня есть крупные потери качества. Я вижу пиксели, но это iPad 3, так как это может быть?

+0

Я забыл сказать, но имейте в виду, что я не снимаю скриншот всего экрана, но в определенном разделе экрана. – user2014474

+0

Вы понимаете, что если ваш генератор случайных чисел выводит любое число выше 2147483647 'num 'будет иметь значение для мусора. –

ответ

1
- (UIImage*)screenshot 
{ 
    // Create a graphics context with the target size 
    // On iOS 4 and later, use UIGraphicsBeginImageContextWithOptions to take the scale into consideration 
    // On iOS prior to 4, fall back to use UIGraphicsBeginImageContext 
    CGSize imageSize = [[UIScreen mainScreen] bounds].size; 
    if (NULL != UIGraphicsBeginImageContextWithOptions) 
     UIGraphicsBeginImageContextWithOptions(imageSize, NO, 0); 
    else 
     UIGraphicsBeginImageContext(imageSize); 

    CGContextRef context = UIGraphicsGetCurrentContext(); 

    // Iterate over every window from back to front 
    for (UIWindow *window in [[UIApplication sharedApplication] windows]) 
    { 
     if (![window respondsToSelector:@selector(screen)] || [window screen] == [UIScreen mainScreen]) 
     { 
      // -renderInContext: renders in the coordinate space of the layer, 
      // so we must first apply the layer's geometry to the graphics context 
      CGContextSaveGState(context); 
      // Center the context around the window's anchor point 
      CGContextTranslateCTM(context, [window center].x, [window center].y); 
      // Apply the window's transform about the anchor point 
      CGContextConcatCTM(context, [window transform]); 
      // Offset by the portion of the bounds left of and above the anchor point 
      CGContextTranslateCTM(context, 
            -[window bounds].size.width * [[window layer] anchorPoint].x, 
            -[window bounds].size.height * [[window layer] anchorPoint].y); 

      // Render the layer hierarchy to the current context 
      [[window layer] renderInContext:context]; 

      // Restore the context 
      CGContextRestoreGState(context); 
     } 
    } 

    // Retrieve the screenshot image 
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 

    UIGraphicsEndImageContext(); 

    return image; 
} 

больше информации прочитала этот технический отчет: Technical Q&A QA1703 Screen Capture in UIKit Applications

+0

Как я могу сделать снимок определенного местоположения, а не всего экрана? – user2014474

+0

Привет, bitmapdata.com, я ищу ответ для вышеупомянутого вопроса, любую идею о том, как экранировать определенное место на экране? – Karthik

0

Вашего размера неправильно, используйте:

CGRect screenBounds = [[UIScreen mainScreen] bounds]; 
CGFloat screenScale = [[UIScreen mainScreen] scale]; 
CGSize screenSize = CGSizeMake(screenBounds.size.width * screenScale, screenBounds.size.height * screenScale); 
UIGraphicsBeginImageContext(screenSize); 
//screenshot code.. 
1

Из дока:

UIGraphicsBeginImageContextWithOptions 
Creates a bitmap-based graphics context with the specified options. 

void UIGraphicsBeginImageContextWithOptions(
    CGSize size, 
    BOOL opaque, 
    CGFloat scale 
); 

Тогда:

UIGraphicsBeginImageContextWithOptions(self.view.frame.size,NO,2.0); 
Смежные вопросы