2012-04-21 3 views
2

Работа с YUV-viewer в python с использованием pygame.Нарисуйте прозрачный прямоугольник на YUV-overlay

Код ниже показывает один кадр YUV 4: 2: 0

#!/usr/bin/env python 

import pygame 

W = 352 
H = 288 
WH = (W, H) 

pygame.init() 
screen = pygame.display.set_mode(WH) 

overlay = pygame.Overlay(pygame.YV12_OVERLAY, WH) 

fd = open('foreman.yuv', 'rb') 
y = fd.read(W * H) 
u = fd.read(W * H/4) 
v = fd.read(W * H/4) 

overlay = pygame.Overlay(pygame.YV12_OVERLAY, WH) 

overlay.display((y, u, v)) 

Этот код отображает 16x16 полупрозрачный прямоугольник в позиции (0,0)

pygame.init() 
screen = pygame.display.set_mode(WH) 

s = pygame.Surface((16,16)) 
s.set_alpha(128) 
s.fill((255,255,255)) 
screen.blit(s, (0,0)) 
pygame.display.flip() 

Но, как я их совмещаю? То есть как отобразить полупрозрачный прямоугольник в позиции (0,0) поверх YUV-данных, чтобы можно было видеть YUV-данные через прямоугольник?

ответ

2

Это ПЕРЕВОЗКА. Вы не можете поставить другие вещи «сверху» от него: от docs:

Объектов наложения всегда виден, и всегда показываете выше в регулярного содержимого дисплея.

YUV накладывается на оборудование, обычно используемое медиаплеерами для отображения видео. Содержимое обычно никогда не записывается в «фреймбуфер» как таковой (вызывая бесконечное горе с пустыми областями для программного обеспечения для скриншотов/захвата экрана и т. Д.).

Таким образом, вам нужно будет нарисовать то, что вы хотите добавить поверх него непосредственно «в» данные y, u, v. (Или преобразовать данные y, u, v в данные RGB и отобразить их более обычными способами).

+0

Глупый я. Пропустил эту строку в документах. Принято и принято –

0

Думал, что я бы опубликовал, как я сделал преобразование из YCbCr поверхности в pygame, так как я не мог найти какое-либо решение с помощью Google.

#!/usr/bin/env python 

import pygame 
import Image 
import sys 

W = 352 
H = 288 
WH = (W, H) 

pygame.init() 
screen = pygame.display.set_mode(WH) 

fd = open('foreman.yuv', 'rb') 
y = fd.read(W * H) 
u = fd.read(W * H/4) 
v = fd.read(W * H/4) 
fd.close() 

# Use PIL to get a black-n-white version of the YCbCr 
# and convert it to RGB 
im = Image.fromstring('L', WH, y) 
rgb = im.convert('RGB') 

s = pygame.image.frombuffer(rgb.tostring(), rgb.size, rgb.mode) 

screen.blit(s, (0,0)) 
pygame.display.flip() 
Смежные вопросы