2012-12-20 5 views
6

현재 원격 데스크톱 유형 프로젝트에서 작업하고 있습니다. 특히 이전에 사용되었던 이전의 depreceated 메서드에 대한 대체 코드를 제공하려고합니다. 나는 이것을 매우 성공적으로, 대부분 관리했지만, 나는 걸림돌에 도달 한 것 같습니다.액자 프레임 버퍼 OSX 10.7

OSX 10.7부터 메소드 호출 CGDisplayBaseAddress가 (1) depreceated되었습니다. 이전에 이것은 메모리의 프레임 버퍼의 기본 주소를주었습니다.이 주소는 화면의 어느 부분이 변경되었는지 확인하고 원격 디스플레이로 전송해야하는 것을 결정하기 위해 다른 곳에서 사용되었습니다. 이제 NULL을 반환합니다.

내 현재 솔루션은 CGImageRef를 제공하는 CGDisplayCreateImage (2)를 사용하여 이미지의 원시 데이터 (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

'CGRegisterScreenRefreshCallback'은 약간 더 좋지만 10.8에서는 여전히 사용되지 않습니다. 어떤 대체물이 있는지 확실하지 않습니다 ... – duskwuff

+0

그래, 유용 할 수 있었다 :) 나는 그들과 함께 약간의 이상한 보안 문제가 없거나 그들이 마법을 도입 할 계획이 없다면 왜 그들이 프레임 버퍼를 사용하기가 어렵게 만드는지 모른다. 그것을 대체 할 추상화 : P 주석 주셔서 감사합니다! – andrewktmeikle

답변

2

로 typedef되어 있습니다 보인다 더 이상 프레임 버퍼에 액세스 할 필요가 없습니다.

그들은 방법 나는 가장 좋은 방법이 될 수 없습니다 위를 수행했지만 그것은 확실히 당신이 디스플레이가 당신이 그것으로하고 싶었던 일을 고정 할 것이다 이전 :

을 수행하는 데 필요한 작동 그런 다음 놓으십시오. 그러면 화면을 해제 할 때 화면 깜박임이 발생할 수 있습니다.

새로운 방법은 이미지를 만드는 통해, 당신은 당신의 황금 :)

내 기존 코드에 추가 할 수

한가지는 당신이해야하는 이미지를 만들 그 어떤 것도 처리하지 않아도 의미 CGImageRef 또는 주요 메모리 누수를 해제해야합니다. 이 작업을 수행하기 위해

은 전화 :

CFRelease(screenShot); 

우리는 또한 같은 방식으로 pixelData 객체를 해제해야합니다.

CFRelease(pixelData);