1

I'm trying to take screenshot of the whole screen from a command line tool compiled with THEOS. I've tried all the Private APIs UICreateScreenImage, UIGetScreenImage and _UICreateScreenUIImage, all return a black or empty image (but the size of the picture is correct)

This is my code that use the "_UICreateScreenUIImage" API:

    extern "C" UIImage* _UICreateScreenUIImage();

    int main(int argc, char **argv, char **envp) {

        UIImage* screenImage = _UICreateScreenUIImage();

        [UIImagePNGRepresentation(screenImage) writeToFile:@"/var/mobile/screenshot.png" atomically:YES];

        [screenImage release];
        return 0;
    }

I've linked the frameworks: Foundation UIKit QuartzCore CoreGraphics and GraphicsServices as private framework. I can't use the Apple way described here Why does my programmatically created screenshot look so bad on iOS 7? because is a command line tool. Any suggestions?

Community
  • 1
  • 1
Neo
  • 11
  • 2

1 Answers1

2

you can try my code. It worked for me.

Option 1:

- (void)takeScreenshotAndSaveToPhotosAlbum {
    extern UIImage *_UICreateScreenUIImage();
    UIImage *screenshot = _UICreateScreenUIImage();
    UIImageWriteToSavedPhotosAlbum(screenshot, nil, nil, nil);
}

Option 2:

typedef struct __IOSurface *IOSurfaceRef;
UIKIT_EXTERN CGImageRef UICreateCGImageFromIOSurface(IOSurfaceRef);

- (void)takeScreenshotAndSaveToPhotosAlbum {
    IOSurfaceRef ioSurfaceRef = (__bridge IOSurfaceRef)([UIWindow performSelector:@selector(createScreenIOSurface)]);
    CGImageRef cgImageRef = UICreateCGImageFromIOSurface(ioSurfaceRef);
    UIImage *uiImage = [UIImage imageWithCGImage:cgImageRef];
    CFRelease(ioSurfaceRef);
    CGImageRelease(cgImageRef);
    UIImageWriteToSavedPhotosAlbum(uiImage, nil, nil, nil);
}
Minh Quy
  • 655
  • 5
  • 21
  • The first option badly leaks memory. The second one only creates black images. – Legoless Nov 25 '15 at 12:12
  • Option 1 should be declared as `OBJC_EXTERN UIImage *_UICreateScreenUIImage(void) NS_RETURNS_RETAINED;` if you develop under ARC. In MRC, you should release it. – cxa Apr 12 '17 at 06:19