iOS 以编程方式截屏会弄乱图像

Posted

技术标签:

【中文标题】iOS 以编程方式截屏会弄乱图像【英文标题】:iOS programatically taking a screen shot messes up the image 【发布时间】:2013-09-07 09:37:51 【问题描述】:

我想在用户每次按住屏幕一秒钟时截屏,然后打开一个电子邮件窗口让用户发送图像。但我有一个奇怪的问题;如果存在渐变图像,图像就会变得混乱(UIImage,其中加载了 PNG 渐变 - 将解释)。

所以我创建了一个UILongPressGestureRecgnizer,将它的minimumPressDuration 设置为1.0f,并将其作为手势识别器添加到主视图:[self.view addGestureRecognizer:myRecognizer]。识别器调用一个方法,比如说shareClicked。我想在其中捕获当前屏幕并弹出带有该图像的电子邮件编辑器。这是我的做法:

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

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

    MFMailComposeViewController *mailComposer = [[MFMailComposeViewController alloc] init];
    mailComposer.mailComposeDelegate = self;
    [mailComposer setSubject:@"Share feature"];
    [mailComposer setMessageBody:[NSString stringWithFormat:@"Im sharing this with you cause its cool."] ishtml:NO];
    [mailComposer addAttachmentData:UIImagePNGRepresentation(image) mimeType:@"image/png" fileName:@"image"];

    [self presentViewController:mailComposer animated:YES completion:NULL];

但是,有一个问题。主视图上有一个表格视图,在第三个单元格中有一个我之前提到的渐变。我不知道如何解释它,但它是这样的:

在图像上可见,顶部有一个渐变,还有一个稍低一些。第一个会正常渲染,而第二个会导致一个奇怪的问题。渐变实际上不是蓝色,而是白色并变为透明。这是黑色表面上的渐变图像:

这是模拟器的屏幕截图:

最后是它在邮件编辑器中的渲染和显示方式:

我做错了什么?问题是什么?它不是模拟器的错,因为它在移动设备上也是一样的。如果这有什么不同,那就是 ios7。

为了清楚起见,顶部渐变是相同的,但呈放射状,并且渲染得非常完美。两种渐变都是 tableview 单元格的子视图。如何解决?希望我们能找到解决方案,因为我确实花了一些时间来“制作”这个问题 :)

【问题讨论】:

您可以将0 传递给UIGraphicsBeginImageContextWithOptions 使其使用主屏幕的比例。 渐变效果如何?您是使用 CGGradient/CGShading 在代码中绘制它,还是加载您单独制作的图像?你提到了一个PNG文件;该文件是有效的标准PNG,还是您需要使用的那种破碎的PNG?检查您的“压缩 PNG 图像”(或其他名称)构建设置并确保它已打开。 另外,您的视图是否覆盖drawRect:?如果是这样,请编辑您的问题以包括实施。如果不是,它的层是自定义层、具有委托的层还是其contents 设置在其他位置的普通层?无论哪种方式,请编辑您的问题以包含绘制到图层上下文或设置图层contents 的代码。 【参考方案1】:

查看推荐的解决方案 https://developer.apple.com/library/ios/qa/qa1703/_index.html#//apple_ref/doc/uid/DTS40010193,因为 UIGetScreenImage 不再允许

【讨论】:

这个不好,会造成如上图那种难看的白色东西。如何解决?

以上是关于iOS 以编程方式截屏会弄乱图像的主要内容,如果未能解决你的问题,请参考以下文章

虚拟机截屏会被发现吗

win32gui在python3.7中截屏会导致内存泄漏

当相机在Android中的表面视图上以编程方式截屏

如何以编程方式在 Android 上截屏?

Android以编程方式截屏

如何以编程方式截屏(Swift、SpriteKit)