[英]How to take screenshot of entire screen on a Jailbroken iOS Device?
I need to take screenshot of the whole screen including the status bar, I use CARenderServerRenderDisplay
to achieve this, it works right on iPad, but wrong at iPhone 6 Plus.我需要对包括状态栏在内的整个屏幕进行截图,我使用
CARenderServerRenderDisplay
来实现这一点,它在 iPad 上运行正常,但在 iPhone 6 Plus 上运行出错。 As the * marked part in the code, if I set width=screenSize.width*scale
and height=screenSize.height*scale
, it will cause crash, if I just change them as: width=screenSize.height*scale
and height=screenSize.width*scale
, it will works, but produce a image like that:作为代码中*标记的部分,如果我设置了
width=screenSize.width*scale
和height=screenSize.height*scale
,则会导致崩溃,如果我只是将它们更改为: width=screenSize.height*scale
and height=screenSize.width*scale
,它会起作用,但会产生这样的图像: , I've tried much but no reason found, does anyone know that?
,我尝试了很多但没有找到原因,有人知道吗? I hope I've described it clear enough.
我希望我已经描述得够清楚了。
- (void)snapshot
{
CGFloat scale = [UIScreen mainScreen].scale;
CGSize screenSize = [UIScreen mainScreen].bounds.size;
//*********** the place where problem appears
size_t width = screenSize.height * scale;
size_t height = screenSize.width * scale;
//***********
size_t bytesPerElement = 4;
OSType pixelFormat = 'ARGB';
size_t bytesPerRow = bytesPerElement * width;
size_t surfaceAllocSize = bytesPerRow * height;
NSDictionary *properties = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES], kIOSurfaceIsGlobal,
[NSNumber numberWithUnsignedLong:bytesPerElement], kIOSurfaceBytesPerElement,
[NSNumber numberWithUnsignedLong:bytesPerRow], kIOSurfaceBytesPerRow,
[NSNumber numberWithUnsignedLong:width], kIOSurfaceWidth,
[NSNumber numberWithUnsignedLong:height], kIOSurfaceHeight,
[NSNumber numberWithUnsignedInt:pixelFormat], kIOSurfacePixelFormat,
[NSNumber numberWithUnsignedLong:surfaceAllocSize], kIOSurfaceAllocSize,
nil];
IOSurfaceRef destSurf = IOSurfaceCreate((__bridge CFDictionaryRef)(properties));
IOSurfaceLock(destSurf, 0, NULL);
CARenderServerRenderDisplay(0, CFSTR("LCD"), destSurf, 0, 0);
IOSurfaceUnlock(destSurf, 0, NULL);
CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, IOSurfaceGetBaseAddress(destSurf), (width * height * 4), NULL);
CGImageRef cgImage = CGImageCreate(width, height, 8,
8*4, IOSurfaceGetBytesPerRow(destSurf),
CGColorSpaceCreateDeviceRGB(), kCGImageAlphaNoneSkipFirst |kCGBitmapByteOrder32Little,
provider, NULL, YES, kCGRenderingIntentDefault);
UIImage *image = [UIImage imageWithCGImage:cgImage];
UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);
}
If you are on a Jailbroken environment, you can use the private UIImage
method _UICreateScreenUIImage
:如果您在越狱环境中,您可以使用私有
UIImage
方法_UICreateScreenUIImage
:
OBJC_EXTERN UIImage *_UICreateScreenUIImage(void);
// ...
- (void)takeScreenshot {
UIImage *screenImage = _UICreateScreenUIImage();
// do something with your screenshot
}
This method uses CARenderServerRenderDisplay
for faster rendering of the entire device screen.此方法使用
CARenderServerRenderDisplay
来更快地渲染整个设备屏幕。 It replaces the UICreateScreenImage
and UIGetScreenImage
methods that were removed in the arm64 version of the iOS 7 SDK.它取代了 iOS 7 SDK 的 arm64 版本中删除的
UICreateScreenImage
和UIGetScreenImage
方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.