在YUV覆盖上绘制透明矩形

时间:2012-04-21 21:19:35

标签: python pygame

使用pygame在python中使用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))

此代码在位置(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数据顶部的位置(0,0)显示半透明矩形,以便通过矩形看到YUV数据?

2 个答案:

答案 0 :(得分:2)

这是一个重要的事情。你不能把其他东西“放在首位”:来自docs

  

叠加层对象始终可见,并且始终显示上方   定期展示内容。

YUV叠加到媒体播放器通常用于显示视频的硬件。内容通常永远不会写入“帧缓冲区”(对屏幕截图/屏幕捕获软件等空白区域造成无尽的悲痛)。

所以你必须直接在“y,u,v”数据中绘制你想要添加的内容。 (或者将y,u,v数据转换为RGB数据并通过更传统的方式显示它。)

答案 1 :(得分: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()