簡體   English   中英

如何在越獄的 iOS 設備上截取整個屏幕?

[英]How to take screenshot of entire screen on a Jailbroken iOS Device?

我需要對包括狀態欄在內的整個屏幕進行截圖,我使用CARenderServerRenderDisplay來實現這一點,它在 iPad 上運行正常,但在 iPhone 6 Plus 上運行出錯。 作為代碼中*標記的部分,如果我設置了width=screenSize.width*scaleheight=screenSize.height*scale ,則會導致崩潰,如果我只是將它們更改為: width=screenSize.height*scale and height=screenSize.width*scale ,它會起作用,但會產生這樣的圖像: 在此處輸入圖片說明 ,我嘗試了很多但沒有找到原因,有人知道嗎? 我希望我已經描述得夠清楚了。

- (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);
}

如果您在越獄環境中,您可以使用私有UIImage方法_UICreateScreenUIImage

OBJC_EXTERN UIImage *_UICreateScreenUIImage(void);

// ...

- (void)takeScreenshot {
    UIImage *screenImage = _UICreateScreenUIImage();
    // do something with your screenshot
}

此方法使用CARenderServerRenderDisplay來更快地渲染整個設備屏幕。 它取代了 iOS 7 SDK 的 arm64 版本中刪除的UICreateScreenImageUIGetScreenImage方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM