2

を使用してPythonでYUVビューアに取り組んでいpygameます。

以下のコードは、YUV 4:2:0の1フレームを表示します

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

このコードは、位置(0,0)に16x16の半透明の長方形を表示します

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データが長方形を通して見えるように、YUVデータの上の位置(0,0)に半透明の長方形を表示するにはどうすればよいですか?

4

2 に答える 2

2

それはオーバーレイです。あなたはそれの「上に」他のものを置くことはできません:ドキュメントから:

オーバーレイオブジェクトは常に表示され、通常の表示コンテンツの上に常に表示されます。

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

したがって、y、u、vデータに直接「追加」したいものを描画する必要があります。(または、y、u、vデータをRGBデータに変換し、従来の方法で表示します)。

于 2012-04-22T00:42:40.627 に答える
0

グーグルを使った解決策が見つからなかったので、pygameでYCbCrからの変換をどのように行ったかを投稿したいと思いました。

#!/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()
于 2012-04-26T13:36:05.157 に答える