Как поместить область изображения Pyglet в PIL Image? - PullRequest
1 голос
/ 04 мая 2009

Мое приложение считывает кадры из видео (используя pyglet), извлекает «полосу» (т. Е. Регион - полная ширина от 1 до 6 строк видео), затем вставляет каждую полосу (добавляет ее) в изображение, которое впоследствии может быть записано файл * .png.

Проблема в том, что изображения Pyglet GL хранятся в графической памяти, поэтому их размер очень ограничен. Мой текущий обходной путь klunky - это создание будущего png-изображения в виде маленьких плиток (т.е. в пределах ограничения размера pyglet GL), когда плитка заполнена, запишите ее в файл * png, прочитайте ее обратно как файл изображения PIL , затем вставьте / добавьте изображение плитки в окончательный файл PIL Image * png.

Я считаю, что должна быть возможность преобразовать полосу pyglet-GL в формат PIL Image-friendly и вставлять / добавлять ее прямо в окончательное изображение PIL, таким образом, не нужно работать с плиткой, что сильно усложняет и оказывает влияние на производительность.

Но я не могу найти, как получить данные полосы в форму, которую я могу вставить в изображение PIL. Я видел много запросов на обратное преобразование, но я никогда не бегал со стадом.

1 Ответ

2 голосов
/ 04 мая 2009

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

nextframe = source.get_next_video_frame () # получить первый кадр видео
while nextframe! = None: # возвращает None в EOF

#
### extract strip data, conver to PIL Image-friendly form, paste itn into travo Image
#
strip = nextframe.get_region(0, (vid_frame_h//2)-(strip_h//2), strip_w, strip_h) # Extract strip from this frame
strip_image_data = strip.get_image_data() 
strip_data = strip_image_data.get_data(strip_image_data.format, strip_image_data.pitch)
strip_Image = Image.frombuffer("RGB", (strip_w, strip_h), strip_data)
travo_image.paste(strip_Image, (0, travo_filled_to, strip_w, travo_filled_to + strip_h)) # paste strip image into travo_image 
travo_filled_to = travo_filled_to + strip_h     # update travo_filled pointer
nextframe = source.get_next_video_frame()       # get next video frame (EOF returns None)    

конец слова "while nextframe! = None:"

...