2012-12-24 56 views
3

我试图采取视网膜屏幕截图编程和我都想尽办法在网上找到,但我没能拿到截图是视网膜。创建视网膜屏幕截图编程导致非视网膜图像

我了解以下私有API:

UIGetScreenImage(); 

不能作为苹果将拒绝您的应用程序。但是,这种方法正是我所需要的(640x960屏幕截图)。

我试图在我的iPhone 4以及对视网膜硬件的iPhone 4仿真这种方法,但由此产生的图像分辨率320x480始终。

-(UIImage *)captureView 
{ 

    AppDelegate *appdelegate = [[UIApplication sharedApplication]delegate]; 


    if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) 
     UIGraphicsBeginImageContextWithOptions(appdelegate.window.bounds.size, NO, 0.0); 
     else 
      UIGraphicsBeginImageContext(appdelegate.window.bounds.size); 


      [appdelegate.window.layer renderInContext:UIGraphicsGetCurrentContext()]; 
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    NSLog(@"SIZE: %@", NSStringFromCGSize(image.size)); 
    NSLog(@"scale: %f", [UIScreen mainScreen].scale); 


    return image; 
} 

我也曾尝试苹果推荐的方法:

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

    NSLog(@"Size: %@", NSStringFromCGSize(image.size)); 

    return image; 
} 

但它也返回一个非视网膜图像: 2012年12月23日19:57:45.205明信片[3351:707]尺寸:{320} 480

有什么明显的我失踪?怎么会有方法,假设采取视网膜屏幕截图返回我非视网膜屏幕截图? 在此先感谢!

+0

除了'image.size'之外,您是否尝试过记录'image.scale'?是1还是2?如果是2,那实际上是一个视网膜图像。 – Pang

+0

哇!我没有意识到图像可以有单独的尺寸和比例设置为2,我检查了返回图像上的比例尺,它是2.0,那么这是否意味着这个图像实际上是640x960?我可以像使用视网膜图像一样使用此图像吗? – bxscikai

回答

4

我在代码中看不到任何错误。除了image.size,你有没有试过记录image.scale?是1还是2?如果是2,那实际上是一个视网膜图像。

UIImage.scale表示图像的比例。因此,UIImage.size为320×480和UIImage.scale为2的图像的实际尺寸为640×960。从苹果的doc:

如果乘以图像(存储在size属性)在此属性的值的逻辑大小,你在像素的图像的尺寸。

这与使用@2x修饰符将图像加载到UIImage中的想法基本相同。例如:

a.png (100×80)  => size=100×80 scale=1 
[email protected] (200×160) => size=100×80 scale=2 
+0

我没有意识到这个缩放属性,我的图像中的缩放比例确实是2.0。非常感谢! – bxscikai

相关问题