【问题标题】:Xcode 4.3 How do I save a region of my app screen?Xcode 4.3 如何保存我的应用程序屏幕的区域?
【发布时间】:2012-11-20 17:36:58
【问题描述】:

我正在 Xcode 4.3 上创建本机应用程序并部署到目标 iOS 5。该应用程序基本上是一个贺卡创建者。我无法弄清楚如何从应用内保存屏幕的一部分。

我想做的是这样的:

我向用户提供了一个按钮,上面写着“电子邮件”。当他们点击按钮时,应用程序应该将他们的卡片“保存”为图像,然后将其“粘贴”到电子邮件正文中。

这与本网站上的其他答案不同的原因是我要保存的区域由 4 个“元素”组成。有一个背景图形是倾斜的卡片背景,然后是一个文本字段,用户可以在其中输入消息,然后旁边是一个图片区域,他们可以选择自己的图片放在卡片上。

这是我正在谈论的照片: http://marklopezdesigns.com/mydownloadz!/screenshotCard3.png

如何保存这些“合成”高分辨率?

然后我如何将其放入电子邮件正文中?

我问如何“保存”它的原因是因为我希望能够为用户提供另一个按钮,上面写着“保存到相机胶卷”和“作为消息发送”。我想如果我能理解如何将这个高分辨率保存到变量中,那么我应该关闭并运行。

提前感谢您的帮助。

========

下面是解决方法

======== ......所以经过一番摆弄。终于得到了我想要的。这是我的方法中的代码库,在触摸“保存到相册”按钮时会触发:

- (IBAction)savePhoto{  

CGRect rect;  
rect = CGRectMake(11,50 ,305, 262);  
UIView *cardViewer = [[UIView alloc] initWithFrame:rect];  
UIGraphicsBeginImageContext(cardViewer.bounds.size);   
//make view background transparent  
cardViewer.backgroundColor = [UIColor colorWithWhite:0.0 alpha:0.0];  
cardViewer.opaque = NO;  

//stuff items into a subview for capturing  
[self.view addSubview:cardViewer];  
[cardViewer addSubview:self.tiltedCard];  
[cardViewer addSubview:self.bigCardView];  
[cardViewer addSubview:self.cardWords];  
[cardViewer addSubview:self.photoView];  

[cardViewer.layer renderInContext:UIGraphicsGetCurrentContext()];  
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();  
UIGraphicsEndImageContext();  
CGImageRef imageRef = CGImageCreateWithImageInRect([viewImage CGImage], rect);  
UIImage *img = [UIImage imageWithCGImage:imageRef];  
CGImageRelease(imageRef);  
UIImageWriteToSavedPhotosAlbum(img, nil, nil, nil);  

//put everything back where it belongs  
[self.view addSubview:self.tiltedCard];  
[self.view addSubview:self.bigCardView];  
[self.view addSubview:self.cardWords];  
[self.view addSubview:self.photoView];  

[cardViewer removeFromSuperview];  

}

【问题讨论】:

  • 那么你想使用 Xcode 还是使用你的应用来截屏?如果不是 Xcode,请不要假装是。
  • 我很确定 OP 希望它作为应用程序的一部分以编程方式完成。
  • 是的,我希望这可以作为应用程序的一部分以编程方式完成。我为用户提供了一个按钮,上面写着“通过电子邮件发送这张卡片”,当发生这种情况时,我想捕获应用程序屏幕的一个区域并将其放在电子邮件正文中。

标签: iphone ios iphone-5


【解决方案1】:

要仅捕获屏幕的一个区域,请使用CGRectMake 指定边界。

CGRect rect = CGRectMake(50, 50, 100, 100);
UIGraphicsBeginImageContext(rect.size);
CGContextRef context = UIGraphicsGetCurrentContext();
[self.view.layer renderInContext:context];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

在上面的示例中,我们从 x:50px 和 y:50px 开始捕获 100px x 100px 区域。

【讨论】:

  • 感谢Bijoy的帮助。
  • 这行得通:UIGraphicsBeginImageContext(self.view.bounds.size); [self.view.layer renderInContext:UIGraphicsGetCurrentContext()]; UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); CGRect 矩形;矩形 = CGRectMake(14,50,294, 203); CGImageRef imageRef = CGImageCreateWithImageInRect([viewImage CGImage], rect); UIImage *img = [UIImage imageWithCGImage:imageRef]; CGImageRelease(imageRef); UIImageWriteToSavedPhotosAlbum(img, nil, nil, nil);
  • 我可以使用上面的代码捕获我想要的区域...有没有办法不从我的应用程序中捕获我的背景文本图像?我不一定要针对视图上的单个图层或对象,因为我想要一张贺卡的合成图像、覆盖在上面的文本以及覆盖在卡片上的用户照片。如图所示:marklopezdesigns.com/mydownloadz!/screenshotCard3.png
  • 这是上面的代码库能够产生的:marklopezdesigns.com/mydownloadz!/almostThere.png 这很棒,但我不想要那个棕褐色的背景。该背景是我的应用程序屏幕的背景。如果可以捕捉除背景之外的所有内容,我将是“黄金”。有什么想法吗?
  • @user1657498 现在我知道你的问题了。解决方案很简单。仅将您需要捕获的内容放在不同的视图中,在上面的代码中,不要使用self.view.layer,而是使用[yourNewView.layer renderInContext:context];。让我知道它是否有效。谢谢...
【解决方案2】:

也许通过渲染图层上下文并抓取图像来获取图层的图片,我用它来显示精美的动画

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

【讨论】:

  • 感谢您的回复。但是,我已经尝试过该代码库,但没有运气。当我应用此代码时返回给我的是整个应用程序屏幕的图像,而不是应用程序屏幕的任意区域。也许有没有办法扩展/修改这个代码库以捕获从 x:50px 和 y:50px 开始的 100px x 100px 区域?
  • Bijoy Thangaraj 为您回答了这个问题,@user1657498 如果您仍需要帮助,请告诉我
【解决方案3】:

要仅捕获屏幕的一个区域,请使用 UIView 或 SubView,然后使用 CGRectMake 指定边界。

CGRect rect = CGRectMake(10, 10, 200, 200);
UIGraphicsBeginImageContext(rect.size);
CGContextRef context = UIGraphicsGetCurrentContext();
[self.YourView.layer renderInContext:context]; // Make sure here you are using the  greetingcardView rather than self.view
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

注意: self.view 将捕获整个屏幕,因此只需在任何地方渲染视图即可。

【讨论】:

    猜你喜欢
    • 2017-05-07
    • 2012-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多