我的视图控制器中有一个UIImageView,我需要采取screeshot。它上面还有一个UILabel。 UIImageView不会覆盖整个页面的一部分。如何截取屏幕上的部分屏幕截图?
我打赌之前已经问过这个问题,但是我查看了这篇文章How to use UIGraphicsBeginImageContextWithOptions?,这只是混淆了未定义的变量
到目前为止,我所拥有的代码截取了整个内容的截图。 (不是我想要的)。我尝试使用screenRect无效。我想在拍完整个屏幕截图后裁剪图片,但问题是每个设备iphone3,iphone4,iphone5,iPad 1,2,3的裁剪尺寸会有所不同。
所以我的问题是有没有办法在没有通过裁剪路线的情况下拍摄一段屏幕的截图?如果裁剪是唯一的方法,那么我是否有办法可靠地剪切图片而不必担心具有高/低像素的不同iOS设备?
testBgImgVw = [[UIImageView alloc] initWithFrame:CGRectMake(0, 80, 320, 220)];
....
-(IBAction) takeScreenshot
{
CGRect screenRect = [[UIScreen mainScreen] bounds];
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone)
{
//its iphone
screenRect = CGRectMake(0, 0, 320, 480);
}
else
{
//its pad
screenRect = CGRectMake(0, 0, 768, 1024);
}
// This code is for high resolution screenshot
UIGraphicsBeginImageContextWithOptions(screenRect.size, NO, 0.0);
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
NSData* imageData = UIImageJPEGRepresentation(viewImage, 1.0);
NSString* incrementedImgStr = [NSString stringWithFormat: @"UserScreenShotPic.jpg"];
NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString* documentsDirectory = [paths objectAtIndex:0];
// Now we get the full path to the file
NSString* fullPathToFile2 = [documentsDirectory stringByAppendingPathComponent:incrementedImgStr];
[imageData writeToFile:fullPathToFile2 atomically:NO];
}
答案 0 :(得分:1)
好的,如果你只是想捕获图像&图像上的标签(如果您可以确保标签始终在图像上),那么
在imageview上添加标签(imageview addSubview:label)
然后将其渲染为新图像
UIGraphicsBeginImageContextWithOptions(screenRect.size, NO,[[UIScreen mainScreen]scale]);
[imageView.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
完成:))
如果您想拍摄几张uiviews(imageview,label等),最好的方法是提供UIView画布
UIView *canvasView = [[UIView alloc]......]
[self.view addSubview:canvasView];
并添加您想要渲染的每个视图,最后将其渲染为您想要的新图像