मैं वर्तमान में एक दूरस्थ डेस्कटॉप प्रकार प्रोजेक्ट पर काम कर रहा हूं, विशेष रूप से मैं पहले इस्तेमाल किए गए पुराने बहिष्कृत तरीकों के लिए प्रतिस्थापन कोड प्रदान करने की कोशिश कर रहा हूं। मैंने इसे सबसे अधिक सफलतापूर्वक प्रबंधित किया है, अधिकांश भाग के लिए, लेकिन मुझे लगता है कि एक ठोकरें ब्लॉक पर पहुंच गया है।फ्रेमबफर ओएसएक्स एक्सेस करना 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 एक अहस्ताक्षरित चार
'सीजीआरजीस्टरस्क्रीन रीफ्रेश कॉलबैक थोड़ा बेहतर है, लेकिन यह अभी भी 10.8 में बहिष्कृत है। सुनिश्चित नहीं है कि कोई प्रतिस्थापन है ... – duskwuff
हाँ, यह उपयोगी हो सकता था :) मुझे नहीं पता कि वे फ्रैम्फफर का उपयोग करने के लिए इतना कठिन क्यों बना रहे हैं जब तक कि इसमें कुछ अजीब सुरक्षा समस्याएं न हों या वे कुछ जादुई पेश करने की योजना बना रहे हों इसे बदलने के लिए अमूर्त: पी टिप्पणी के लिए धन्यवाद! – andrewktmeikle