【问题标题】:How to get 2x image as screen shot?如何获得 2x 图像作为屏幕截图?
【发布时间】:2014-06-13 13:05:17
【问题描述】:

我想截取窗口的屏幕截图并将该图像用作新视图控制器的背景视图。我的问题是,该图像在视网膜显示中有些模糊,因为图像应该是 640X1136。但是下面的代码返回的图片尺寸只有320X568

注意:如果我使用苹果的私有 API UIGetScreenImage(),它会返回尺寸为 640X1136 的图像。

   -(UIImage*)getScreenShot:(CALayer*)layer 
    {
            UIGraphicsBeginImageContextWithOptions(layer.frame.size, NO, 0.0);
            [layer renderInContext:UIGraphicsGetCurrentContext()];
            UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
            UIGraphicsEndImageContext();
            return image;
    }

       [self getScreenShot:self.window.layer];

有什么方法可以在不使用苹果私有 API 的情况下获得 640X1136 尺寸的屏幕截图?

【问题讨论】:

    标签: ios uiimageview screenshot


    【解决方案1】:
    -(UIImage*)getScreenShot:(CALayer*)layer
    {
        CGFloat scale = 1.0;
    #if __IPHONE_OS_VERSION_MAX_ALLOWED >= 40000
        if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]){
            scale = [[UIScreen mainScreen] scale];
        }
    #endif
        UIGraphicsBeginImageContextWithOptions(CGSizeMake(layer.frame.size.width*scale, layer.frame.size.height*scale), NO, 0.0);
        [layer renderInContext:UIGraphicsGetCurrentContext()];
        UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        return image;
    }
    

    【讨论】:

      【解决方案2】:

      如果您使用的是 iOS 7,则可以使用专为截屏而设计的新方法 drawViewHierarchyInRect:afterScreenUpdates:(查看此文档链接,了解有关 drawViewHierarchyInRect:afterScreenUpdates: 方法的 BOOL 参数的信息)。
      如果没有,您可以使用旧方法renderInContext:。如果您只针对 iOS 7,可以删除下面的 if 语句。

      UIVIew *window = [UIApplication sharedApplication].delegate.window;
      CGRect rect = window.bounds;
      UIGraphicsBeginImageContextWithOptions(rect.size, NO, 0);
      if ([window respondsToSelector:@selector(drawViewHierarchyInRect:afterScreenUpdates:)]) {
          [window drawViewHierarchyInRect:rect afterScreenUpdates:NO];
      } else {
          [window.layer renderInContext:UIGraphicsGetCurrentContext()];
      }
      UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
      UIGraphicsEndImageContext();
      // image now contains a screen shot
      

      scale 参数确保屏幕截图是正确的分辨率,将0 传递给UIGraphicsBeginImageContextWithOptions 意味着它将使用[UIScreen mainScreen].scale 值。 UIImage 可能会将其size 报告为非视网膜,但其scale 将正确为2.0,并且此值用于根据文档计算像素图像大小:

      如果将图像的逻辑大小(存储在size 属性中)乘以此属性中的值,则可以得到图像的尺寸(以像素为单位)。

      【讨论】:

        【解决方案3】:

        试试这个,

          UIGraphicsBeginImageContext(self.bounds.size);    
        

          UIGraphicsBeginImageContext(CGSizeMake(640X1136));
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-01-20
          • 2020-08-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-06-14
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多