2013-05-09 4 views
6

मैं पृष्ठभूमि सेवा से एक स्क्रीनशॉट कैप्चर करना चाहता हूं। निजी एपीआई ठीक है क्योंकि मुझे ऐप स्टोर में जमा करने की आवश्यकता नहीं है। मैंने पहले से ही UIGetScreenImage की कोशिश की है और यह पृष्ठभूमि ऐप से काम नहीं करता है।आईओएसयूफ़ेस - आईओएस प्राइवेट एपीआई - पृष्ठभूमि में स्क्रीनशॉट कैप्चर करें

मैं निम्नलिखित कोड का उपयोग कर रहा हूं जो मुझे एसओ से मिला है। IOSurfaceCreate मेरे लिए शून्य वापस आती है। किसी भी मदद की सराहना की।

CFMutableDictionaryRef dict; 
     IOSurfaceRef screenSurface = NULL; 

     char pixelFormat[4] = {'A','R','G','B'}; 
     dict = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); 

     uint32_t width ; 
     uint32_t height; 
     void *pitch; 
     void *bPE; 
     void *size; 
     CFDictionarySetValue(dict, kIOSurfaceIsGlobal, kCFBooleanTrue); 
     CFDictionarySetValue(dict, kIOSurfaceBytesPerRow, CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &pitch)); 
     CFDictionarySetValue(dict, kIOSurfaceBytesPerElement, CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &bPE)); 
     CFDictionarySetValue(dict, kIOSurfaceWidth, CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &width)); 
     CFDictionarySetValue(dict, kIOSurfaceHeight, CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &height)); 
     CFDictionarySetValue(dict, kIOSurfacePixelFormat, CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, pixelFormat)); 
     CFDictionarySetValue(dict, kIOSurfaceAllocSize, CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &size)); 

     IOSurfaceRef destSurf = IOSurfaceCreate(dict); 
     IOSurfaceAcceleratorRef outAcc; 
     IOSurfaceAcceleratorCreate(NULL, 0, &outAcc); 

     CFDictionaryRef ed = (__bridge CFDictionaryRef)[NSDictionary dictionaryWithObjectsAndKeys: nil]; 
     IOSurfaceAcceleratorTransferSurface(outAcc, screenSurface, destSurf, ed, NULL); 
     uint32_t aseed; 
     IOSurfaceUnlock(screenSurface, kIOSurfaceLockReadOnly, &aseed); 

     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, self_object, nil, nil); 
     CGImageRelease(cgImage); 
     CFRelease(destSurf); 

उत्तर

8

2 स्थानों से कोड जोड़ने के बाद, मैं फोटो एलबम में फोटो सहेजने में सक्षम था (पृष्ठभूमि में मेरे आवेदन के साथ)।

IOSurfaces - Artefacts in video and unable to grab video surfaces

https://github.com/tomcool420/SMFramework/blob/master/SMFScreenCapture.m

बाहर कोशिश करते हैं और मुझे पता है कि वह आपके लिए काम करता है तो बताएं।

-(void)SavePhoto 
{ 
    IOMobileFramebufferConnection connect; 
    kern_return_t result; 
    IOSurfaceRef screenSurface = NULL; 

    io_service_t framebufferService = IOServiceGetMatchingService(kIOMasterPortDefault, IOServiceMatching("AppleH1CLCD")); 
    if(!framebufferService) 
     framebufferService = IOServiceGetMatchingService(kIOMasterPortDefault, IOServiceMatching("AppleM2CLCD")); 
    if(!framebufferService) 
     framebufferService = IOServiceGetMatchingService(kIOMasterPortDefault, IOServiceMatching("AppleCLCD")); 

    result = IOMobileFramebufferOpen(framebufferService, mach_task_self(), 0, &connect); 

    result = IOMobileFramebufferGetLayerDefaultSurface(connect, 0, &screenSurface); 

    uint32_t aseed; 
    IOSurfaceLock(screenSurface, kIOSurfaceLockReadOnly, &aseed); 
    uint32_t width = IOSurfaceGetWidth(screenSurface); 
    uint32_t height = IOSurfaceGetHeight(screenSurface); 
    //int m_width = 320; 
    //int m_height = 480; 
    CFMutableDictionaryRef dict; 
    int pitch = width*4, size = width*height*4; 
    int bPE=4; 
    char pixelFormat[4] = {'A','R','G','B'}; 
    dict = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); 
    CFDictionarySetValue(dict, kIOSurfaceIsGlobal, kCFBooleanTrue); 
    CFDictionarySetValue(dict, kIOSurfaceBytesPerRow, CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &pitch)); 
    CFDictionarySetValue(dict, kIOSurfaceBytesPerElement, CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &bPE)); 
    CFDictionarySetValue(dict, kIOSurfaceWidth, CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &width)); 
    CFDictionarySetValue(dict, kIOSurfaceHeight, CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &height)); 
    CFDictionarySetValue(dict, kIOSurfacePixelFormat, CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, pixelFormat)); 
    CFDictionarySetValue(dict, kIOSurfaceAllocSize, CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &size)); 

    IOSurfaceRef destSurf = IOSurfaceCreate(dict); 

    void* outAcc; 
    IOSurfaceAcceleratorCreate(NULL, 0, &outAcc); 

    IOSurfaceAcceleratorTransferSurface(outAcc, screenSurface, destSurf, dict, NULL); 

    IOSurfaceUnlock(screenSurface, kIOSurfaceLockReadOnly, &aseed); 
    CFRelease(outAcc); 

    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 *img = [UIImage imageWithCGImage:cgImage]; 
    UIImageWriteToSavedPhotosAlbum(img, self, nil, nil); 

    // MOST RELEVANT PART OF CODE 

    //CVPixelBufferCreateWithBytes(NULL, width, height, kCVPixelFormatType_32BGRA, IOSurfaceGetBaseAddress(destSurf), IOSurfaceGetBytesPerRow(destSurf), NULL, NULL, NULL, &sampleBuffer); 
} 
+0

क्या आपको यह आईओएस 7 पर काम करना पड़ा? मुझे IOMobileFramebufferOpen पर एक लिंकर त्रुटि मिल रही है। क्या आप कृपया साझा कर सकते हैं कि कौन से ढांचे/lib वास्तव में लिंक करने के लिए और आपने हेडर को कहाँ पकड़ लिया? – Frank

+0

त्रुटियों को हटाने के लिए इस टर्मिनल cmd को जोड़ने के साथ आईओएसयूफ़ेस > सीडी/एप्लीकेशन/एक्सकोड.एप/सामग्री/डेवलपर/प्लेटफार्म/आईफोनओएस/प्लेटफार्म/डेवलपर/एसडीके/आईफोनओएस 7.0.sdk/सिस्टम/लाइब्रेरी/फ्रेमवर्क/आईओकिट से त्रुटियों को हटाने के लिए। ढांचा > सुडो एलएन-संस्करण/ए/आईओकिट – HDNZ

+0

क्या किसी के पास आईओएस 8 के लिए एक कामकाजी डेमो प्रोजेक्ट है? या मुझे बता सकता है कि इस ढांचे का उपयोग कैसे करें/हेडर की पकड़ कैसे प्राप्त करें? – Max

संबंधित मुद्दे