CGWindowListCreateImage создает сломанное изображение - PullRequest
0 голосов
/ 01 октября 2018

Цель : я хочу периодически делать скриншот окна в OSX.

Следуя инструкциям Apple, мне удалось создать простой рабочий код, который очень хорошо захватывает содержимое окна.Однако проблема в том, что примерно 1 из 50 изображений по какой-то причине искажается.

Я использую функцию CGWindowListCreateImage для периодического захвата содержимого окна, но он продолжает производить мусор со временем

это мой простой код:

CGImageRef img = CGWindowListCreateImage(CGRectNull,
                                         kCGWindowListOptionIncludingWindow,
                                         wc->window.window_id, wc->image_option);
if (!img)
    return;

char path_str[1024];
snprintf(path_str, 1023, "/tmp/obs/image%llu.png", ts);

// here is just output image to file "as is"
CFURLRef path =
        CFURLCreateWithFileSystemPath(NULL,
                                      __CFStringMakeConstantString(path_str),
                                      kCFURLPOSIXPathStyle, false);

// file/format to save pixels to
CGImageDestinationRef destination =
        CGImageDestinationCreateWithURL(
                path, CFSTR("public.png"), 1, NULL); //[4]

// add our captured pixels
CGImageDestinationAddImage(destination, img, nil);

// generate the image
if (!CGImageDestinationFinalize(destination)) {
    printf("Failed to finalize\n");
}

Я провел тест для разных приложений и окон, поэтому результат выглядит так:

Хорошая картинка (чтоя ожидаю от кода выше)

A good picture (what i expect from code above)

Неработающая картинка (такая картинка была сделана случайно ~ 1/50)

Broken picture (such picture is being capture with chance ~ 1/50)

Что я уже пробовал:

  • для воспроизведения с параметром CGWindowImageOption
  • для использования CGWindowListCreateImageFromArray вместо
  • для вывода изображения на экран, я видел те же результаты.
  • создайте CGImageRef на файле вместо записи с помощью CGWindowListCreateImage - работает нормально.

    Используемая конфигурация:

    • macOS 10.13.6
    • XQuartz 2.7.11
    • CoreGraphics 2.0

На данный момент я предполагаю CGWindowListCreateImage глючит или что-то в этом роде.Кто-нибудь видел нечто подобное?

...