ios工程——(UIView)获取设备相册权限截取屏幕内容并保存到设备本地相册

设备/引擎:Mac(11.6)/cocos

开发工具:Xcode(13.0)

开发需求:对某个玩法进行截屏操作,并以图片形式保存到设备相册中

很多时候我们需要允许用户对游戏进行截屏并保存到相册,尤其是带有DIY属性的玩法,用户更希望将自己的想法保存起来,所以添加截屏功能可以很好的提高用户体验。

一般要完成截屏保存功能需要分以下几步:
获取设备权限->截屏并将内容以图片形式储存起来->保存图片到设备相册

1.获取设备权限
在工程的Info.plist中添加权限
在这里插入图片描述

Application requires iPhone environment

设置为YES,即表示允许App访问iPhone

2.截屏并将内容以图片形式储存起来
此部分主要是将需要保存的部分转换为图片形式,主要用到了cocos中的CCRenderTexture创建动态纹理,主要分为以下几步:
1).创建一个新的CCRenderTexture:指定所要创建纹理的宽度和高度。
2).调用CCRenderTexture的begin方法:设置OpenGL以便之后的任何图形绘制都在CCRenderTexture上。
3).绘制纹理:使用原始的OpenGL命令来绘制,或通过调用现有的Cocos2D对象的visit方法。
4).调用CCRenderTexture的end方法:渲染纹理,关闭绘制到纹理上。
5).调用CCImage,将CCRenderTexture创建的纹理保存为图片。
代码如下:

    CCSize winSize = CCDirector::sharedDirector()->getWinSize();
    CCRenderTexture* renderTexture = CCRenderTexture::create(winSize.width, winSize.height);
    renderTexture->begin();
    picLayer->visit();
    renderTexture->end();
    renderTexture->cleanup();
    CCImage* image = renderTexture->newCCImage();
    image->autorelease();
    return image;

3.保存图片到设备相册
1)创建一个基于位图的上下文(context),并将其设置为当前上下文(context)

UIGraphicsBeginImageContextWithOptions(size, NO, [UIScreen mainScreen].scale);
CGRect rect = viewController.view.frame;

size就是取当前屏幕的尺寸:

RootViewController* viewController = [(AppController*)[[UIApplication sharedApplication] delegate] viewController];
CGSize size = viewController.view.bounds.size;

参数NO:是否为透明图层

第三个参数是缩放比例,iPhone 4是2.0,其他是1.0。这里可以用[UIScreen mainScreen].scale来获取,也可以设为0,系统就会自动设置正确的比例了。

注:UIGraphicsBeginImageContextWithOptions必须有对应的UIGraphicsEndImageContext结尾,不然会发生内存泄露问题

2)截取一个UIView或者其子类中的内容,并且以位图的形式(bitmap)保存到UIImage中

[viewController.view drawViewHierarchyInRect:rect afterScreenUpdates:YES];

注:自iOS7开始,UIView类提供了一个方法-drawViewHierarchyInRect:afterScreenUpdates:来完成上述操作

3)将图片保存到相册

UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext(); //对应UIGraphicsBeginImageContextWithOptions函数
UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);

至此就可以完成截屏并将图片保存到设备相册中的功能

4.优化部分
以上操作只是将截屏的内容保存到相册,对于开发者来说,我们还需要考虑将屏幕中多余的内容在截屏前去除,截屏后再显示,比如返回按钮、相机按钮……,这样用户截屏后就会完整保存自己DIY的部分,而不是将屏幕中所有内容保存下来~~~

希望能给大家带来一些帮助!!!有什么需要讨论交流的可以私信+评论~~~

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐