2012-04-21 137 views
2

使用pygame在python中使用YUV查看器。在YUV覆盖图上绘制透明矩形

下面的代码显示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)) 

这个代码显示在适当位置的16×16半透明矩形(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() 

但是,如何我结合他们吗?即如何在YUV数据顶部的位置(0,0)上显示半透明矩形,以便可以通过矩形看到YUV数据?

回答

2

这是一个叠加。你不能把其他的东西,“上面”的是:从docs

的覆盖对象始终可见,并始终显示以上的 常规的显示内容。

YUV覆盖点击媒体播放器通常用于显示视频的硬件。内容通常不会写入“帧缓冲区”(导致屏幕截图/截屏软件等空白区域无尽的悲伤)。

所以你必须画出你想要添加的东西,直接写入y,u,v数据。 (或者将y,u,v数据转换成RGB数据并用更传统的方式显示)。

+0

傻了。错过了文档中的该行。 Upvoted和接受 – 2012-04-22 20:48:38

0

想到我会发布我如何从YCbCr转换pygame中的表面,因为我找不到任何使用谷歌的解决方案。

#!/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()