本文转载至:http://blog.csdn.net/zeng11088/article/details/8664510

分类: UIImageView2013-03-12 16:42 122人阅读 评论(0) 收藏 举报

开发游戏时,往往会有这么一个需求:在某个成就达成或者破纪录时,需要截个屏,然后发送到微博上与好友/粉丝分享,虽然home + 开机键组合可手动截屏,在Cocos2d有个CCRenderTexture类,借助该类可很容易实现代码截取功能。使用CCRenderTexture,我们可以截取游戏场景、某个Layer,甚至是精灵:

 
  1. /**游戏截图
  2. *@param node 需要截取的控件
  3. */
  4. - (void)snapshotScreen:(CCNode*)node
  5. {
  6. //取得屏幕大小
  7. CGSize winSize = [[CCDirector sharedDirector]winSize];
  8. CCRenderTexture* renderTexture = [CCRenderTexture renderTextureWithWidth:winSize.width
  9. height:winSize.height];
  10. [renderTexture begin];
  11. [node visit];
  12. [renderTexture end];
  13. [renderTexture cleanup];
  14. UIImage *snapshot = [renderTexture getUIImageFromBuffer];
  15. //把截图保存到相册里
  16. UIImageWriteToSavedPhotosAlbum(snapshot, nil, nil, nil);
  17. }

如果游戏支持高清模式,上面代码截出来的图是960 * 640大小的,这个尺寸如果要上传到微博上,文件的大小可能会超出限制,那么在上传前可用先把截图大小缩小点如480*320,以减少图片体积:

  1. /** 调整图片大小*/
  2. - (UIImage *) scaleFromImage: (UIImage *) image toSize: (CGSize) size
  3. {
  4. UIGraphicsBeginImageContext(size);
  5. [image drawInRect:CGRectMake(0, 0, size.width, size.height)];
  6. UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
  7. UIGraphicsEndImageContext();
  8. return newImage;
  9. }

同时可以保存

  1. 保存文件
  2. UIImage *m_imgFore=......;
  3. //png格式
  4. NSData *imagedata=UIImagePNGRepresentation(m_imgFore);
  5. //JEPG格式
  6. //NSData *imagedata=UIImageJEPGRepresentation(m_imgFore,1.0);
  7. NSArray*paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
  8. NSString *documentsDirectory=[paths objectAtIndex:0];
  9. NSString *savedImagePath=[documentsDirectorystringByAppendingPathComponent:@"saveFore.png"];
  10. [imagedata writeToFile:savedImagePath atomically:YES];
  11. 或者
  12. [fileManager createFileAtPath:[filePath stringByAppendingString:@"/image.png"] contents:data attributes:nil];    将图片保存为PNG格式
  13. [fileManager createFileAtPath:[filePath stringByAppendingString:@"/image.jpg"] contents:data attributes:nil];   将图片保存为JPEG格式

如果不是cocos2D开发,则使用如下代码:

方法1:

  1. -(void)screenShots
  2. {
  3. CGSize imageSize = [[UIScreen mainScreen] bounds].size;
  4. if (NULL != UIGraphicsBeginImageContextWithOptions) {
  5. UIGraphicsBeginImageContextWithOptions(imageSize, NO, 0);
  6. }
  7. else
  8. {
  9. UIGraphicsBeginImageContext(imageSize);
  10. }
  11. CGContextRef context = UIGraphicsGetCurrentContext();
  12. for (UIWindow * window in [[UIApplication sharedApplication] windows]) {
  13. if (![window respondsToSelector:@selector(screen)] || [window screen] == [UIScreen mainScreen]) {
  14. CGContextSaveGState(context);
  15. CGContextTranslateCTM(context, [window center].x, [window center].y);
  16. CGContextConcatCTM(context, [window transform]);
  17. CGContextTranslateCTM(context, -[window bounds].size.width*[[window layer] anchorPoint].x, -[window bounds].size.height*[[window layer] anchorPoint].y);
  18. [[window layer] renderInContext:context];
  19. CGContextRestoreGState(context);
  20. }
  21. }
  22. UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
  23. UIGraphicsEndImageContext();
  24. UIImageWriteToSavedPhotosAlbum(image, self, nil, nil);
  25. NSLog(@"Suceeded!");
  26. }

(注意:方法1截图后会是竖屏,所以需要配合UIImage旋转的方法判断方向后旋转才能合适保存,见文章旋转翻转UIImage 不是UIImageView 适用于源图像的处理,例如截图后旋转)

所以再提供另外一方法:

方法2

  1. UIView *view = [[[[[UIApplication sharedApplication] windows] objectAtIndex:1] subviews] lastObject];//获得某个window的某个subView
  2. NSInteger index = 0;//用来给保存的png命名
  3. for (UIView *subView in [view subviews]) {//遍历这个view的subViews
  4. if ([subView isKindOfClass:NSClassFromString(@"UIImageView")] || [subView isKindOfClass:NSClassFromString(@"UIThreePartButton")]) {//找到自己需要的subView
  5. //支持retina高分的关键
  6. if(UIGraphicsBeginImageContextWithOptions != NULL)
  7. {
  8. UIGraphicsBeginImageContextWithOptions(subView.frame.size, NO, 0.0);
  9. } else {
  10. UIGraphicsBeginImageContext(subView.frame.size);
  11. }
  12. //获取图像
  13. [subView.layer renderInContext:UIGraphicsGetCurrentContext()];
  14. UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
  15. UIGraphicsEndImageContext();
  16. //保存图像
  17. NSString *path = [NSHomeDirectory() stringByAppendingFormat:@"/%d.png",index];
  18. if ([UIImagePNGRepresentation(image) writeToFile:path atomically:YES]) {
  19. index += 1;
  20. NSLog(@"Succeeded!");
  21. }
  22. else {
  23. NSLog(@"Failed!");
  24. }
  25. }
  26. }

iOS实现截屏 并合适保存的更多相关文章

  1. IOS上架截屏 屏幕快照

    IOS上架截屏,屏幕快照,4种屏幕尺寸,每种尺寸5张软件功能截图. 大小等于对应设备的屏幕的像素大小.使用模拟器,command +s截图就可以了虚拟机里的手机截屏就保存在mac 桌面上了.jpg,p ...

  2. iOS 模拟器截屏快捷键

    iOS 模拟器截屏快捷键: cmd+S

  3. iOS手机截屏使用

    .截屏 保存 .data //登录成功进行截屏 //截取屏幕大小 UIGraphicsBeginImageContext([[UIScreen mainScreen]bounds].size); [s ...

  4. iOS 手机截屏

    百度地图自带截图功能,可以截取路线列表,保存到本地.可是对比发现截下来的图片并不是app中看到的那样,截图中头部加入了搜索的起点和终点,每段路程的详细站点都已展开,而且图片会根据路线的长短自动判断图片 ...

  5. IOS中截屏的实现,很简易的方法

    // 添加QuartzCore.framework库 #import <QuartzCore/QuartzCore.h> -(void) screenShot { // 截屏 UIGrap ...

  6. iOS应用截屏

    iPhone自从推出后就自带了截屏功能,简单而易用,所以应用就没什么截屏的需求了,不过有些时候我们还是会遇到这个需求.比如,我们开发了一个播放器,用openGL进行video render,此时直接截 ...

  7. ios 代码截屏模糊问题解决办法

    我们常用的截图方法如下所示: //尺寸是按照 UIGraphicsBeginImageContext(CGSizeMake(, )); //currentView 当前的view 创建一个基于位图的图 ...

  8. iOS屏幕截屏

    #import "ViewController.h" @interface ViewController () @end @implementation ViewControlle ...

  9. QT在windows下实现截屏操作并保存为png图片

    QPixmap originalPixmap = QPixmap::grabWindow(QApplication::desktop()->winId()); QString format = ...

随机推荐

  1. Linux命令-网络命令:ping

    ping 192.168.67.1 ping windows网卡地址,默认会一直ping下去,区别于windows的ping命令ping4次 ping -c 次192. 友情提示:如果您(阅读者)是从 ...

  2. public static void main(String args[])什么意思?

    public static void main(String[] args) 这绝对不是凭空想出来的,也不是没有道理的死规定,而是java程序执行的需要. jvm在试图运行一个类之前,先检查该类是否包 ...

  3. 迅为4412开发板Linux驱动教程——总线_设备_驱动注冊流程具体解释

    视频下载地址: 驱动注冊:http://pan.baidu.com/s/1i34HcDB 设备注冊:http://pan.baidu.com/s/1kTlGkcR 总线_设备_驱动注冊流程具体解释 • ...

  4. Mysql5.7的初始密码更改

    软件版本的变化真是让人兴奋…… Linux服务器决定安装使用mysql 5.7了. 愉快的去官网下载安装包:https://dev.mysql.com/downloads/mysql/ 解决完所有依赖 ...

  5. [svc]expect的爱恨情仇

    背景 openvpn生成证书想把它做成一键化,这样添加新用户时候就方便 遇到的问题 我的代码 gg_vpn_keys.exp #!/usr/bin/expect set user [lindex $a ...

  6. OpenCV3+Python3

    OpenCV3计算机视觉Python语言实现笔记 图像处理与OpenCV Python3与OpenCV3.3 图像处理 OpenCV文摘 基于Python3 + OpenCV3.3.1的远程监控程序 ...

  7. HotSpot模板解释器目标代码生成过程源码分析

    虽然说解释执行模式是逐字逐句翻译给目标平台运行的,但这样的过程未免太过缓慢,如果能把字节码说的话做成纸条,运行时只要把对应的纸条交给目标平台就可以了,这样,执行速度就会明显提升.JVM的Hotspot ...

  8. oracle查询数据库最大连接数等信息

    .当前的数据库连接数 select count(*) from v$process where program='ORACLE.EXE(SHAD)'; .数据库允许的最大连接数 select valu ...

  9. 面向对象设计原则一:单一职责原则(SRP)

    单一职责原则(SRP) 定义:系统中的每一个类都应该只有一个职责. 好处:高内聚.低耦合. 解释说明: 单一职责也就是说我们应该让一个类或一个对象只做一件事情,每个类所要关注的就是自己要完成的职责是什 ...

  10. IOS 中微信 网页授权报 key[也就是code]失效 解决办法

    枪魂微信平台ios手机点击返回 网页授权失败,报key失效.已经解决,原因是授权key只能使用一次,再次使用就会失效. 解决办法:第一次从菜单中进行授权时,用session记录key和open_id. ...