PIL - ›преобразование изображений PyGame: частичная потеря данных

Я использую концепцию снимков экрана на основе C из ответа JHolta в снимок экрана с помощью скрипта Python. [Linux] для создания снимков экрана, которые я хотел бы отображать в PyGame. С некоторыми незначительными изменениями (добавление extern "C" к функциям и импорт Xutil вместо Xlib) предоставленный код работает на удивление хорошо. Короче говоря, он использует Image.frombuffer в массиве байтов, возвращаемом библиотекой C. При использовании show() изображение и все, что с ним связано, отображается ImageMagick.

Однако, если я конвертирую его в PyGame Python 3 согласно PIL и pygame.image, я только получить черную поверхность. Однако это непростая проблема: если я рисую изображение перед его преобразованием в изображение PyGame (как в OP последней ссылки), оно отображается на черном фоне при отображении результата. Кроме того, print просмотр байтовых объектов из PILImage.tobytes и pygame.image.tostring показывает, что они оба содержат данные и их len идентичны.

Что я здесь делаю не так? Я с удовольствием предоставлю код, если это необходимо, но я думаю, что это скорее концептуальная проблема, и я особо не менял фрагменты из этих ответов.

(Между прочим, аналогичная проблема в Python 2, но там PyGame использует str вместо byte для tostring / fromstring, а печать tostring, похоже, дает пустую строку.)


person Pikaro    schedule 08.04.2018    source источник


Ответы (1)


Оказывается, триггер с ошибкой заставил снова сделать снимок экрана, пока открывалось полноэкранное окно, в котором он отображался. Я полагаю, что в этот момент есть несколько миллисекунд черноты или неопределенного состояния (в контексте функции скриншота), и библиотека достаточно быстра, чтобы это уловить.

Я не уверен, что это должно продолжаться, потому что это, по сути, напоминание о том, что нужно проверить вещи, которые человек не может воспринять. Не стесняйтесь удалять, если это не подходит.

person Pikaro    schedule 08.04.2018
comment
Что ж, спасибо за то, что вы узнали это самостоятельно! Если вы считаете, что это может быть проблемой, из-за которой другие могут столкнуться, оставьте сообщение здесь (вы даже можете принять свой собственный ответ, несколько раз позже). В противном случае вы можете удалить его самостоятельно. - person Jongware; 08.04.2018