iOS实现截屏 并合适保存
开发游戏时,往往会有这么一个需求:在某个成就达成或者破纪录时,需要截个屏,然后发送到微博上与好友/粉丝分享,虽然home + 开机键组合可手动截屏,在Cocos2d有个CCRenderTexture类,借助该类可很容易实现代码截取功能。使用CCRenderTexture,我们可以截取游戏场景、某个Layer,甚至是精灵:
- /**游戏截图
- *@param node 需要截取的控件
- */
- - (void)snapshotScreen:(CCNode*)node
- {
- //取得屏幕大小
- CGSize winSize = [[CCDirector sharedDirector]winSize];
- CCRenderTexture* renderTexture = [CCRenderTexture renderTextureWithWidth:winSize.width
- height:winSize.height];
- [renderTexture begin];
- [node visit];
- [renderTexture end];
- [renderTexture cleanup];
- UIImage *snapshot = [renderTexture getUIImageFromBuffer];
- //把截图保存到相册里
- UIImageWriteToSavedPhotosAlbum(snapshot, nil, nil, nil);
- }
如果游戏支持高清模式,上面代码截出来的图是960 * 640大小的,这个尺寸如果要上传到微博上,文件的大小可能会超出限制,那么在上传前可用先把截图大小缩小点如480*320,以减少图片体积:
- /** 调整图片大小*/
- - (UIImage *) scaleFromImage: (UIImage *) image toSize: (CGSize) size
- {
- UIGraphicsBeginImageContext(size);
- [image drawInRect:CGRectMake(0, 0, size.width, size.height)];
- UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
- UIGraphicsEndImageContext();
- return newImage;
- }
同时可以保存
- 保存文件
- UIImage *m_imgFore=......;
- //png格式
- NSData *imagedata=UIImagePNGRepresentation(m_imgFore);
- //JEPG格式
- //NSData *imagedata=UIImageJEPGRepresentation(m_imgFore,1.0);
- NSArray*paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
- NSString *documentsDirectory=[paths objectAtIndex:0];
- NSString *savedImagePath=[documentsDirectorystringByAppendingPathComponent:@"saveFore.png"];
- [imagedata writeToFile:savedImagePath atomically:YES];
- 或者
- [fileManager createFileAtPath:[filePath stringByAppendingString:@"/image.png"] contents:data attributes:nil]; 将图片保存为PNG格式
- [fileManager createFileAtPath:[filePath stringByAppendingString:@"/image.jpg"] contents:data attributes:nil]; 将图片保存为JPEG格式
如果不是cocos2D开发,则使用如下代码:
方法1:
- -(void)screenShots
- {
- CGSize imageSize = [[UIScreen mainScreen] bounds].size;
- if (NULL != UIGraphicsBeginImageContextWithOptions) {
- UIGraphicsBeginImageContextWithOptions(imageSize, NO, 0);
- }
- else
- {
- UIGraphicsBeginImageContext(imageSize);
- }
- CGContextRef context = UIGraphicsGetCurrentContext();
- for (UIWindow * window in [[UIApplication sharedApplication] windows]) {
- if (![window respondsToSelector:@selector(screen)] || [window screen] == [UIScreen mainScreen]) {
- CGContextSaveGState(context);
- CGContextTranslateCTM(context, [window center].x, [window center].y);
- CGContextConcatCTM(context, [window transform]);
- CGContextTranslateCTM(context, -[window bounds].size.width*[[window layer] anchorPoint].x, -[window bounds].size.height*[[window layer] anchorPoint].y);
- [[window layer] renderInContext:context];
- CGContextRestoreGState(context);
- }
- }
- UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
- UIGraphicsEndImageContext();
- UIImageWriteToSavedPhotosAlbum(image, self, nil, nil);
- NSLog(@"Suceeded!");
- }
(注意:方法1截图后会是竖屏,所以需要配合UIImage旋转的方法判断方向后旋转才能合适保存,见文章旋转翻转UIImage 不是UIImageView 适用于源图像的处理,例如截图后旋转)
所以再提供另外一方法:
方法2
- UIView *view = [[[[[UIApplication sharedApplication] windows] objectAtIndex:1] subviews] lastObject];//获得某个window的某个subView
- NSInteger index = 0;//用来给保存的png命名
- for (UIView *subView in [view subviews]) {//遍历这个view的subViews
- if ([subView isKindOfClass:NSClassFromString(@"UIImageView")] || [subView isKindOfClass:NSClassFromString(@"UIThreePartButton")]) {//找到自己需要的subView
- //支持retina高分的关键
- if(UIGraphicsBeginImageContextWithOptions != NULL)
- {
- UIGraphicsBeginImageContextWithOptions(subView.frame.size, NO, 0.0);
- } else {
- UIGraphicsBeginImageContext(subView.frame.size);
- }
- //获取图像
- [subView.layer renderInContext:UIGraphicsGetCurrentContext()];
- UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
- UIGraphicsEndImageContext();
- //保存图像
- NSString *path = [NSHomeDirectory() stringByAppendingFormat:@"/%d.png",index];
- if ([UIImagePNGRepresentation(image) writeToFile:path atomically:YES]) {
- index += 1;
- NSLog(@"Succeeded!");
- }
- else {
- NSLog(@"Failed!");
- }
- }
- }
iOS实现截屏 并合适保存的更多相关文章
- IOS上架截屏 屏幕快照
IOS上架截屏,屏幕快照,4种屏幕尺寸,每种尺寸5张软件功能截图. 大小等于对应设备的屏幕的像素大小.使用模拟器,command +s截图就可以了虚拟机里的手机截屏就保存在mac 桌面上了.jpg,p ...
- iOS 模拟器截屏快捷键
iOS 模拟器截屏快捷键: cmd+S
- iOS手机截屏使用
.截屏 保存 .data //登录成功进行截屏 //截取屏幕大小 UIGraphicsBeginImageContext([[UIScreen mainScreen]bounds].size); [s ...
- iOS 手机截屏
百度地图自带截图功能,可以截取路线列表,保存到本地.可是对比发现截下来的图片并不是app中看到的那样,截图中头部加入了搜索的起点和终点,每段路程的详细站点都已展开,而且图片会根据路线的长短自动判断图片 ...
- IOS中截屏的实现,很简易的方法
// 添加QuartzCore.framework库 #import <QuartzCore/QuartzCore.h> -(void) screenShot { // 截屏 UIGrap ...
- iOS应用截屏
iPhone自从推出后就自带了截屏功能,简单而易用,所以应用就没什么截屏的需求了,不过有些时候我们还是会遇到这个需求.比如,我们开发了一个播放器,用openGL进行video render,此时直接截 ...
- ios 代码截屏模糊问题解决办法
我们常用的截图方法如下所示: //尺寸是按照 UIGraphicsBeginImageContext(CGSizeMake(, )); //currentView 当前的view 创建一个基于位图的图 ...
- iOS屏幕截屏
#import "ViewController.h" @interface ViewController () @end @implementation ViewControlle ...
- QT在windows下实现截屏操作并保存为png图片
QPixmap originalPixmap = QPixmap::grabWindow(QApplication::desktop()->winId()); QString format = ...
随机推荐
- JavaScript 参考教程
JavaScript 是使用“对象化编程”的,或者叫“面向对象编程”的.所谓“对象化编程”,意思是把 JavaScript 能涉及的范围划分成大大小小的对象,对象下面还继续划分对象直至非常详细为止,所 ...
- static 与单例模式、auto_ptr与单例模式、const 用法小结、mutable修饰符
一.static 与单例模式 单例模式也就是简单的一种设计模式,它需要: 保证一个类只有一个实例,并提供一个全局访问点 禁止拷贝 C++ Code 1 2 3 4 5 6 7 8 9 10 11 ...
- mac shell终端编辑命令行快捷键——行首行尾
mac shell终端编辑命令行快捷键——行首行尾 ctrl+a //移到行首ctrl+e //移到行尾===========linux系统用============alt+a //移到光标所在单词首 ...
- unity, standard shader消耗两个draw call
假设场景中只放一个球,关掉阴影和skybox,球体使用Unlit/Texture shader,则draw call数为2(背景占一个draw call,球占一个draw call). 相同情况下若将 ...
- 【死磕Java并发】-----J.U.C之AQS:CLH同步队列
此篇博客全部源代码均来自JDK 1.8 在上篇博客[死磕Java并发]-–J.U.C之AQS:AQS简单介绍中提到了AQS内部维护着一个FIFO队列,该队列就是CLH同步队列. CLH同步队列是一个F ...
- atitit.自动生成数据库结构脚本,或者更换数据库,基于hibernate4
atitit.自动生成数据库结构脚本,或者更换数据库,基于hibernate4 目前近况:: 更换数据库,但是是使用spring集成的. <!-- hibernate配置文件路径 --> ...
- python核心编程——python对象
一.什么是python对象 在python中,构造的不论什么类型的值都是一个对象.比方一个整数类型的值,一个字符串.一个列表等,都能够看做是对象. 全部的对象分为三部分: (1)身份.每一个对象都有个 ...
- win32之取画刷的方法
取画刷(HBRUSH) 的六种方法2009-- :00HBRUSH hbr; 第一种: hbr= CreateSolidBrush(RGB(,,)); //单色的画刷 第二种: hbr= (HBRUS ...
- centOS7 配置DNS上外网
CentOS7 linux下DNS的永久性添加 I.网上很多讲的dns的永久性添加其实都是暂时性添加,重启网卡后就会丢失.代码如下: echo nameserver 8.8.8.8 > /etc ...
- nyoj16矩形嵌套(第一道dp关于dag的题目)
http://acm.nyist.net/JudgeOnline/problem.php?pid=16 题意:有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形X(a,b)可以嵌套在矩形Y(c, ...