2012-04-21 136 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()