2012-12-20 18 views
6

मैं वर्तमान में एक दूरस्थ डेस्कटॉप प्रकार प्रोजेक्ट पर काम कर रहा हूं, विशेष रूप से मैं पहले इस्तेमाल किए गए पुराने बहिष्कृत तरीकों के लिए प्रतिस्थापन कोड प्रदान करने की कोशिश कर रहा हूं। मैंने इसे सबसे अधिक सफलतापूर्वक प्रबंधित किया है, अधिकांश भाग के लिए, लेकिन मुझे लगता है कि एक ठोकरें ब्लॉक पर पहुंच गया है।फ्रेमबफर ओएसएक्स एक्सेस करना 10.7

ओएसएक्स 10.7 के रूप में विधि कॉल CGDisplayBaseAddress को हटा दिया गया है (1)। इससे पहले मुझे मेमोरी में फ्रेमबफर का मूल पता दिया गया था, जिसे स्क्रीन के किन हिस्सों को बदल दिया गया था और यह निर्धारित करने के लिए कि रिमोट डिस्प्ले को क्या भेजा जाना है, यह देखने के लिए कहीं और इस्तेमाल किया गया था। अब यह शून्य लौटाता है।

मेरे वर्तमान समाधान CGDisplayCreateImage (2) है, जो मुझे एक CGImageRef कि मैं तो कच्चे डेटा के लिए सूचक प्राप्त करने के लिए उपयोग कर सकते हैं देता है उपयोग करने के लिए किया गया है (एक CFDataRef वस्तु के माध्यम से - कोड के लिए नीचे देखें) छवि के लिए।

क्या यह करने का सबसे अच्छा तरीका है? निश्चित रूप से यह करने का एक बेहतर तरीका होना चाहिए!

संक्षेप में: मैं स्क्रीन पर किसी भी ड्राइंग को नहीं करना चाहता हूं या कुछ भी मैं स्मृति में पहले बाइट को पॉइंटर प्राप्त करने की कोशिश कर रहा हूं जिसमें डेस्कटॉप फ्रेमबफर या (जैसा कि मैं वर्तमान में कर रहा हूं) छवि डेटा

किसी भी मदद के लिए धन्यवाद! :)

वर्तमान समाधान कोड: CGImageRef प्राप्त करने के लिए

CFDataRef copy_image_pixels(CGImageRef inImage) { 
    return CGDataProviderCopyData(CGImageGetDataProvider(inImage)); 
} 

/** 
ret_byte_buffer is the byte buffer containing the pixel data for the image **/ 
void *getPixelDataForImage (CGImageRef image) 
{ 
    //Check image ref is not null 
    if (!image){ 
     NSLog(@"Error - image was null"); 
     return -1; 
    } 

    //Gets a CFData reference for the specified image reference 
    CFDataRef pixelData = copy_image_pixels(image); 
    //Gets a readonly pointer to the image data 
    const UInt8 *pointerToData = CFDataGetBytePtr(pixelData); //This returns a read only version 
    //Casting to a void pointer to return, expected to be cast to a byte_t * 
    CFIndex length_of_buffer = CFDataGetLength(pixelData); 
    printf("Size of buffer is %zu\n",length_of_buffer); 
    return (void *)pointerToData; 

} 

कोड स्निपेट -

osx_disp= main_screen_details->main_screenid; //Returns CGDirectDisplayID 
CGImageRef screenShot = CGDisplayCreateImage(osx_disp); 
byte_t *image_byte_data = getPixelDataForImage(screenShot); 

byte_t एक अहस्ताक्षरित चार

+0

'सीजीआरजीस्टरस्क्रीन रीफ्रेश कॉलबैक थोड़ा बेहतर है, लेकिन यह अभी भी 10.8 में बहिष्कृत है। सुनिश्चित नहीं है कि कोई प्रतिस्थापन है ... – duskwuff

+0

हाँ, यह उपयोगी हो सकता था :) मुझे नहीं पता कि वे फ्रैम्फफर का उपयोग करने के लिए इतना कठिन क्यों बना रहे हैं जब तक कि इसमें कुछ अजीब सुरक्षा समस्याएं न हों या वे कुछ जादुई पेश करने की योजना बना रहे हों इसे बदलने के लिए अमूर्त: पी टिप्पणी के लिए धन्यवाद! – andrewktmeikle

उत्तर

2

अपना शोध से होने की typedef'd है ऐसा लगता है कि अब आपको फ्रेमबफर तक पहुंच की आवश्यकता नहीं है।

वे जिस तरह से मैं इसे ऊपर किया है सबसे अच्छा तरीका नहीं हो सकता है लेकिन यह निश्चित रूप क्या मैं इसे जरूरत है :)

इससे पहले ऐसा करने के लिए आप प्रदर्शन क्या आप इसके साथ करना चाहता था कर लॉक करनी होगी लिए काम करता है फिर इसे रिलीज़ करें, जो स्क्रीन को रिलीज़ करते समय कभी-कभी स्क्रीन फ्लिकर की ओर ले जा सकता है।

नया तरीका, छवि बनाने के माध्यम से, मतलब है कि आप बस छवि और अपने सुनहरे :)

एक बात मैं अपने मौजूदा कोड को जोड़ना होगा है कि आप करना चाहिए बनाने कि में से किसी के साथ सौदा करने की जरूरत नहीं है CGImageRef या इसकी एक प्रमुख मेमोरी रिसाव को मुक्त करना याद रखें।

ऐसा करने में सिर्फ फोन:

CFRelease(screenShot); 

हम भी उसी तरह से pixelData वस्तु को रिहा करने की जरूरत है।

CFRelease(pixelData); 
संबंधित मुद्दे