Мне нужно сделать снимок экрана всего экрана, включая строку состояния, я использую CARenderServerRenderDisplay
, чтобы добиться этого, он работает прямо на iPad, но неправильно на iPhone 6 Plus. В качестве * отмеченной части кода, если я установил width=screenSize.width*scale
и height=screenSize.height*scale
, это приведет к сбою, если я их просто изменил как:и height=screenSize.width*scale
, он будет работать, но создаст такое изображение: , я пробовал много, но нет причин, кто-нибудь знает это? Надеюсь, я описал это достаточно ясно.Как сделать снимок экрана всего экрана на устройстве Jailbroken iOS?
- (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);
}
My environment is jailbroken iPhone 6 Plus с iOS 9.0.2. – Suge
Ваш провайдер может предоставить только 'width * height * 4' байты, но' CGImageCreate' запросит его для 'IOSurfaceGetBytesPerRow (destSurf) * height * 4' байт. Возможно, поэтому он падает? –
@robmayoff, я взял тест только сейчас, он разбился на 'CARenderServerRenderDisplay'. – Suge