2012-04-21 6 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

それはOVERLAYです。

オーバーレイオブジェクトが常に表示され、そして常に上記 通常の表示内容を示しています。docsから:あなたはそれの「上に」他のものを置くことはできません。

YUVオーバーレイは、ビデオを表示するために通常メディアプレーヤーによって使用されるハードウェアにタップします。コンテンツは、通常、「フレームバッファ」に書き込まれることはありません(スクリーンショット/スクリーンキャプチャソフトウェアなどのために空白領域を無限に悲しんでしまいます)。

だからあなたはあなたがY、U、Vデータ「に」直接その上に追加したいものを描く必要があるだろう。 (または、y、u、vデータをRGBデータに変換し、従来の手段で表示する)。私はpygameの中のYCbCrから表面に変換をしたどのように私はグーグルを使って任意の解決策を見つけることができませんでしたので、私は、投稿したい

+0

愚かな私。ドキュメントのその行を逃しました。アップフォートされ承認された –

0

思想。

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