1. 程式人生 > >iOS實現截圖 併合適儲存

iOS實現截圖 併合適儲存

開發遊戲時,往往會有這麼一個需求:在某個成就達成或者破紀錄時,需要截個屏,然後傳送到微博上與好友/粉絲分享,雖然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. }  

所以再提供另外一方法:

方法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.     }