2009-05-03 6 views
1

Mon application lit les images de la vidéo (en utilisant pyglet), extrait une «bande» (c'est-à-dire la largeur de 1 à 6 lignes vidéo), puis colle chaque bande (l'ajoute) dans une image * Fichier .png.Comment mettre la région de l'image de Pyglet dans PIL Image?

Problème: les images GL de Pyglet sont stockées dans la mémoire graphique, de sorte que leur taille est très limitée. Mon actuelle solution de contournement de klunky est de construire l'image png en tant que petites tuiles (ie dans la limite de taille de pyglet GL), quand la tuile est pleine, écrivez-la dans un fichier * png, lisez-la comme une image PIL fichier, puis collez/ajoutez l'image de la mosaïque au fichier PIL Image * png final. Je pense qu'il devrait être possible de convertir la bande pyglet-GL en un format PIL Image-friendly, et de coller/ajouter directement dans l'image PIL finale, sans avoir besoin de l'entreprise de carrelage, ce qui complique grandement les choses et a un impact sur les performances.

Mais je ne peux pas trouver comment obtenir les données de bande dans une forme que je peux coller dans une image PIL. J'ai vu beaucoup de demandes de conversion dans l'autre sens, mais je n'ai jamais couru avec le troupeau.

Répondre

2

Je sais qu'il est mal vu de répondre à sa propre question, mais je travaille sur une réponse qui peut être utile à d'autres, si elle est ici ...

nextframe = source.get_next_video_frame() # obtenir d'abord image vidéo
en nextframe = Aucun: # Aucun retourne EOF

# 
### extract strip data, conver to PIL Image-friendly form, paste itn into travo Image 
# 
strip = nextframe.get_region(0, (vid_frame_h//2)-(strip_h//2), strip_w, strip_h) # Extract strip from this frame 
strip_image_data = strip.get_image_data() 
strip_data = strip_image_data.get_data(strip_image_data.format, strip_image_data.pitch) 
strip_Image = Image.frombuffer("RGB", (strip_w, strip_h), strip_data) 
travo_image.paste(strip_Image, (0, travo_filled_to, strip_w, travo_filled_to + strip_h)) # paste strip image into travo_image 
travo_filled_to = travo_filled_to + strip_h  # update travo_filled pointer 
nextframe = source.get_next_video_frame()  # get next video frame (EOF returns None)  

fin "tandis que nextframe = Aucun:"

Questions connexes