2017.03.16 12:18* 字数 52 阅读 563评论 4喜欢 2

1. 截取屏幕尺寸大小的图片并保存至相册

保存至相册只需将方法saveImage中的代码替换即可

UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, YES, 0.0);

[self.view.layer renderInContext:UIGraphicsGetCurrentContext()];

UIImage *image = UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

2. scrollViewtableView的全部截屏并保存至相册

- (void)saveImage {

UIImage* viewImage = nil;

UITableView *scrollView = self.tableView;

UIGraphicsBeginImageContextWithOptions(scrollView.contentSize, scrollView.opaque, 0.0);

{

CGPoint savedContentOffset = scrollView.contentOffset;

CGRect savedFrame = scrollView.frame;


scrollView.contentOffset = CGPointZero;

scrollView.frame = CGRectMake(0, 0, scrollView.contentSize.width, scrollView.contentSize.height);


[scrollView.layer renderInContext: UIGraphicsGetCurrentContext()];

viewImage = UIGraphicsGetImageFromCurrentImageContext();


scrollView.contentOffset = savedContentOffset;

scrollView.frame = savedFrame;

}

UIGraphicsEndImageContext();


[self saveImageToPhotos:viewImage];

}


- (void)saveImageToPhotos:(UIImage*)savedImage {

UIImageWriteToSavedPhotosAlbum(savedImage, self, @selector(image:didFinishSavingWithError:contextInfo:), NULL);

}


- (void)image: (UIImage *) image didFinishSavingWithError: (NSError *) error contextInfo: (void *) contextInfo {

NSString *msg = nil ;

if(error != NULL){

msg = @"保存图片失败" ;

}else{

msg = @"保存图片成功" ;

}

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"保存图片结果提示"

message:msg

delegate:self

cancelButtonTitle:@"确定"

otherButtonTitles:nil];

[alert show];

}




+ (UIImage *)screenshot
{
CGSize imageSize = CGSizeZero;

UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;
if (UIInterfaceOrientationIsPortrait(orientation)) {
imageSize = [UIScreen mainScreen].bounds.size;
} else {
imageSize = CGSizeMake([UIScreen mainScreen].bounds.size.height, [UIScreen mainScreen].bounds.size.width);
}

UIGraphicsBeginImageContextWithOptions(imageSize, NO, 0);
CGContextRef context = UIGraphicsGetCurrentContext();
for (UIWindow *window in [[UIApplication sharedApplication] windows]) {
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);
if (orientation == UIInterfaceOrientationLandscapeLeft) {
CGContextRotateCTM(context, M_PI_2);
CGContextTranslateCTM(context, 0, -imageSize.width);
} else if (orientation == UIInterfaceOrientationLandscapeRight) {
CGContextRotateCTM(context, -M_PI_2);
CGContextTranslateCTM(context, -imageSize.height, 0);
} else if (orientation == UIInterfaceOrientationPortraitUpsideDown) {
CGContextRotateCTM(context, M_PI);
CGContextTranslateCTM(context, -imageSize.width, -imageSize.height);
}
if ([window respondsToSelector:@selector(drawViewHierarchyInRect:afterScreenUpdates:)]) {
[window drawViewHierarchyInRect:window.bounds afterScreenUpdates:YES];
} else {
[window.layer renderInContext:context];
}
CGContextRestoreGState(context);
}

UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}

swift

class func screenshot() -> UIImage {
var imageSize = CGSizeZero

let orientation = UIApplication.sharedApplication().statusBarOrientation
if UIInterfaceOrientationIsPortrait(orientation) {
imageSize = UIScreen.mainScreen().bounds.size
} else {
imageSize = CGSize(width: UIScreen.mainScreen().bounds.size.height, height: UIScreen.mainScreen().bounds.size.width)
}

UIGraphicsBeginImageContextWithOptions(imageSize, false, 0)
let context = UIGraphicsGetCurrentContext()
for window in UIApplication.sharedApplication().windows {
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)
if orientation == .LandscapeLeft {
CGContextRotateCTM(context, CGFloat(M_PI_2))
CGContextTranslateCTM(context, 0, -imageSize.width)
} else if orientation == .LandscapeRight {
CGContextRotateCTM(context, -CGFloat(M_PI_2))
CGContextTranslateCTM(context, -imageSize.height, 0)
} else if orientation == .PortraitUpsideDown {
CGContextRotateCTM(context, CGFloat(M_PI))
CGContextTranslateCTM(context, -imageSize.width, -imageSize.height)
}
if window.respondsToSelector("drawViewHierarchyInRect:afterScreenUpdates:") {
window.drawViewHierarchyInRect(window.bounds, afterScreenUpdates: true)
} else if let context = context {
window.layer.renderInContext(context)
}
CGContextRestoreGState(context)
}

let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return image
}



 



iOS应用内截图代码

有待改写工具类?????

2016.06.17

第一种方法(截全屏幕)

下面这段代码可以将当前屏幕显示的内容截图放置相册中,需要导入

-(void)viewDidAppear:(BOOL)animated


{


[superviewDidAppear:animated];


self.view.backgroundColor= [UIColorgreenColor];


UIWindow*screenWindow = [[UIApplicationsharedApplication]keyWindow];


UIGraphicsBeginImageContext(screenWindow.frame.size);


[screenWindow.layerrenderInContext:UIGraphicsGetCurrentContext()];


UIImage* viewImage =UIGraphicsGetImageFromCurrentImageContext();


UIGraphicsEndImageContext();


UIImageWriteToSavedPhotosAlbum(viewImage,nil,nil,nil);


}

第二种方法(自定义截图区域)

#pragmamark -=====自定义截屏位置大小的逻辑代码=====-


staticintScreenshotIndex=0; //


-(void)ScreenShot{


//这里因为我需要全屏接图所以直接改了,宏定义iPadWithd为1024,iPadHeight为768,


//UIGraphicsBeginImageContextWithOptions(CGSizeMake(640, 960), YES, 0);//设置截屏大小


UIGraphicsBeginImageContextWithOptions(CGSizeMake(iPadWidth, iPadHeight), YES,0);//设置截屏大小


[[self.view layer] renderInContext:UIGraphicsGetCurrentContext()];


UIImage *viewImage =UIGraphicsGetImageFromCurrentImageContext();


UIGraphicsEndImageContext();


CGImageRef imageRef =viewImage.CGImage;


//CGRect rect = CGRectMake(166, 211, 426, 320);//这里可以设置想要截图的区域


CGRect rect = CGRectMake(0,0, iPadWidth, iPadHeight);//这里可以设置想要截图的区域


CGImageRef imageRefRect =CGImageCreateWithImageInRect(imageRef, rect);


UIImage *sendImage =[[UIImage alloc] initWithCGImage:imageRefRect];


UIImageWriteToSavedPhotosAlbum(sendImage, nil, nil, nil);//保存图片到照片库


NSData *imageViewData =UIImagePNGRepresentation(sendImage);


NSArray *paths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);


NSString *documentsDirectory = [paths objectAtIndex:0];


NSString *pictureName= [NSString stringWithFormat:@"screenShow_%d.png",ScreenshotIndex];


NSString *savedImagePath =[documentsDirectory stringByAppendingPathComponent:pictureName];


NSLog(@"截屏路径打印: %@", savedImagePath);


//这里我将路径设置为一个全局String,这里做的不好,我自己是为了用而已,希望大家别这么写


[self SetPickPath:savedImagePath];


[imageViewData writeToFile:savedImagePath atomically:YES];//保存照片到沙盒目录


CGImageRelease(imageRefRect);


ScreenshotIndex++;


}


//设置路径


- (void)SetPickPath:(NSString *)PickImage {


_ScreenshotsPickPath =PickImage;


}


//获取路径<这里我就直接用于邮件推送的代码中去了,能达到效果,但肯定有更好的写法>


- (NSString *)GetPickPath {


return_ScreenshotsPickPath;


}


IOS获取设备屏幕代码(截屏)

2016.07.18 09:38*


-(void) screenShot{


UIGraphicsBeginImageContext(self.bounds.size); //self为需要截屏的UI控件 即通过改变此参数可以截取特定的UI控件

[self.layer renderInContext:UIGraphicsGetCurrentContext()];

UIImage *image= UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

NSLog(@"image:%@",image); //至此已拿到image


UIImageView *imaView = [[UIImageView alloc] initWithImage:image];

imaView.frame = CGRectMake(0, 700, 500, 500);

[self addSubview:imaView];


UIImageWriteToSavedPhotosAlbum(image, self, nil, nil);//把图片保存在本地

}