<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>BoxHeadRoom &#187; PyGame</title>
	<atom:link href="http://boxheadroom.com/tag/pygame/feed" rel="self" type="application/rss+xml" />
	<link>http://boxheadroom.com</link>
	<description>蝸牛の一歩</description>
	<lastBuildDate>Tue, 07 Feb 2012 13:41:06 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>【PyGame】画面のAVI書き出し＆スクリーンショット</title>
		<link>http://boxheadroom.com/2009/02/20/pygame_avi_save</link>
		<comments>http://boxheadroom.com/2009/02/20/pygame_avi_save#comments</comments>
		<pubDate>Thu, 19 Feb 2009 23:50:50 +0000</pubDate>
		<dc:creator>boxheadroom</dc:creator>
				<category><![CDATA[PC]]></category>
		<category><![CDATA[game]]></category>
		<category><![CDATA[video]]></category>
		<category><![CDATA[OpenCV]]></category>
		<category><![CDATA[PyGame]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://boxheadroom.com/?p=2514</guid>
		<description><![CDATA[棚上げしてあったPyGameのチュートリアルにチャレンジ開始。
ついでに、PyGameの画面を静止画や動画で保存できるようにするモジュールを書いてみました。
PyGameとは、ゲーム用のライブラリSDLをPythonから使えるようにしたもの。

Pythonでゲーム作りますが何か？
やっと４分の１ぐらいサンプルコードを動かしました
Pygame入門
Pygame公式
　　クラスライブラリを調べるのに。

本格的にゲームを作るつもりは無いのですが。。。ちょっとしたインタラクティブな映像を作るのによさげ。
表示中の映像をAVIに保存する機能は、標準では用意されてないみたいなので、書いてみました。
（もっと　賢いやり方があったら教えてください。。。）
数日～数週間、一時　勉強を中断しなきゃいけないので、コードを紛失しないようにメモ。
また、時間が出来たら　動くサンプルコード＆サンプル動画を作成予定
＜＜注意＞＞
音声は保存できません。　（OpenCVの制限）
コード
以下を videowriter.pyというファイル名で保存。

Python 2.5系で検証
必要なライブラリは　PyGame， PIL，　OpenCV (CVtypes)
CVtypesについてはコチラ

ダウンロード




#!/usr/bin/env python
# -*- coding: utf-8 -*-
#videowriter.py
import Image
import CVtypes as cv
import atexit

#SCREEN_SIZE = (W, H)

class VideoWriter(object):
    def write_frame_pygame(self,sc):
        """
            write_frame for PyGame Surface
        """
 [...]]]></description>
			<content:encoded><![CDATA[<p>棚上げしてあったPyGameのチュートリアルにチャレンジ開始。<br />
ついでに、PyGameの画面を静止画や動画で保存できるようにするモジュールを書いてみました。</p>
<p>PyGameとは、ゲーム用のライブラリSDLをPythonから使えるようにしたもの。</p>
<ul class="list1" style="padding-left: 16px; margin-left: 16px;">
<li><a href="http://pygame.skr.jp/" rel="nofollow">Pythonでゲーム作りますが何か？</a><br />
やっと４分の１ぐらいサンプルコードを動かしました</li>
<li><a href="http://www.halb-katze.jp/pygt/" rel="nofollow">Pygame入門</a></li>
<li><a href="http://www.pygame.org/docs/" rel="nofollow">Pygame公式</a><br />
　　クラスライブラリを調べるのに。</li>
</ul>
<p>本格的にゲームを作るつもりは無いのですが。。。ちょっとしたインタラクティブな映像を作るのによさげ。<br />
表示中の映像をAVIに保存する機能は、標準では用意されてないみたいなので、書いてみました。</p>
<p>（もっと　賢いやり方があったら教えてください。。。）<br />
数日～数週間、一時　勉強を中断しなきゃいけないので、コードを紛失しないようにメモ。<br />
また、時間が出来たら　動くサンプルコード＆サンプル動画を作成予定<br />
＜＜注意＞＞<br />
音声は保存できません。　（OpenCVの制限）</p>
<h2 id="content_1_0">コード</h2>
<p>以下を videowriter.pyというファイル名で保存。</p>
<ul class="list1" style="padding-left: 16px; margin-left: 16px;">
<li>Python 2.5系で検証</li>
<li>必要なライブラリは　PyGame， PIL，　OpenCV (CVtypes)</li>
<li><a href="http://boxheadroom.com/tag/opencv" rel="nofollow">CVtypesについてはコチラ</a>
<ul class="list2" style="padding-left: 16px; margin-left: 16px;">
<li><a href="http://uncpythontools.cvs.sourceforge.net/uncpythontools/CV/" rel="nofollow">ダウンロード</a></li>
</ul>
</li>
</ul>
<hr class="full_hr">
<pre class="code">#!/usr/bin/env python
# -*- coding: utf-8 -*-
#videowriter.py
import Image
import CVtypes as cv
import atexit

#SCREEN_SIZE = (W, H)

class VideoWriter(object):
    def write_frame_pygame(self,sc):
        """
            write_frame for PyGame Surface
        """
        #print self.idx
        self.idx+=1
        s=str(sc.get_buffer().raw)
        cv.cvSetData(self.cvimg,s,self.W*self.bpp)
        #cv.cvShowImage("test",self.cvimg)
        cv.cvWriteFrame(self.vw,self.cvimg)

    def atexist(self):
        cv.cvReleaseVideoWriter(self.vw)

    def __init__(self,fname, size=(640,480),
                 fps=30,codec=-1,bpp=4,mode="pygame"):
        """
        bpp=bit_per_pixel
        mode  , now pygame only (extendable)
        """
        self.idx=0
        modelist={"pygame":self.write_frame_pygame}

        self.write_frame=modelist[mode]
        self.bpp=bpp
        self.SCREEN_SIZE=size
        self.W,self.H=size
        self.vw=cv.cvCreateVideoWriter(fname,
            codec,fps,cv.CvSize(*size))
        self.cvimg=cv.cvCreateImage(cv.CvSize(*size),8,bpp)
        atexit.register(self.atexist)
        #終了時に aviファイルを自動的にclose

#オマケ
#PyGameのSurfaceデータを　PIL画像データに変換
def img(s):
#ピクセル取得
    buf=s.get_buffer()
    im =Image.fromstring("RGBA",s.get_size(),buf.raw)
    B,G,R,A=im.split()
    return Image.merge("RGBA",(R,G,B,A))
</pre>
<div id="pukiwiki_content2" class="pukiwiki_content">
<hr class="full_hr">
<h2 id="content_1_0">使い方</h2>
<p>このコード自体は検証してないです。　　<s>後日、ちゃんと動くサンプルを作成予定～</s><br />
代表的なPyGameのサンプルコードは、こんな感じのループになってるのですが</p>
<pre class="code">
import pygame
from pygame.locals import *
from videowriter import VideoWriter,img  #☆☆☆　インポート
#
vw=VideoWriter("filename.avi")        #☆☆☆　 出力ファイル名を指定して初期化
#
SCREEN_SIZE=(640,480)

pygame.init()
screen = pygame.display.set_mode(SCREEN_SIZE)
～～～～（中略）～～～～～～
clock = pygame.time.Clock()
while True:　#Pygameのメインループ
    clock.tick(30)  #毎秒の表示コマ数に応じてウェイト
                        #ディスク上のAVIへ書き込むことを考えると、FPSは　15コマ／秒程度がよさげ
                        # （速いマシンなら　もっと速くできるかもですが）
    screen.blit( ほげほげ, (x,y))  #　個々のキャラクターを描画

  ～～～～このへんに、描画のメイン処理～～～～～～
    pygame.display.update()             #画面に反映
    vw.write_frame(screen)               #☆☆☆ ここでAVI に １コマ書き出し

    for event in pygame.event.get():   #窓を閉じると終了
        if event.type == QUIT:
            sys.exit()
</pre>
<p>という感じで使います。</p>
<div class="jumpmenu"><a href="#pukiwiki_content2">↑</a></div>
<h2 id="content_1_1">オマケの静止画保存</h2>
<pre class="code">
from videowriter import VideoWriter,img  #☆☆☆　インポート
from datetime import datetime
#画面のスクリーンショットをとりたくなった場所で適宜
im=img(screen)
im.save("screenshot%s.jpg"%datetime.today().strftime("%Y%m%d-%H%M%S"))
</pre>
<p><span id="more-2514"></span></p>

	Tags: <a href="http://boxheadroom.com/tag/opencv" title="OpenCV" rel="tag">OpenCV</a>, <a href="http://boxheadroom.com/tag/pygame" title="PyGame" rel="tag">PyGame</a>, <a href="http://boxheadroom.com/tag/python" title="Python" rel="tag">Python</a><br />

	<h4>Related posts</h4>
	<ul class="st-related-posts">
	<li><a href="http://boxheadroom.com/2011/09/16/namedlist2" title="Pythonで名前つきリスト その2 (9月 16, 2011)">Pythonで名前つきリスト その2</a> (0)</li>
	<li><a href="http://boxheadroom.com/2011/02/11/urllib2_range" title="【Py】webページの先頭数バイトだけ取得 (2月 11, 2011)">【Py】webページの先頭数バイトだけ取得</a> (0)</li>
	<li><a href="http://boxheadroom.com/2010/10/29/wget_py" title="wget.py webをまとめて取得　などなど (10月 29, 2010)">wget.py webをまとめて取得　などなど</a> (0)</li>
	<li><a href="http://boxheadroom.com/2010/09/21/py_cui_progress_ba" title="CUIでプログレスバーもどき (9月 21, 2010)">CUIでプログレスバーもどき</a> (0)</li>
	<li><a href="http://boxheadroom.com/2010/09/18/matplotlib_delaunay" title="ドロネー三角形 matplotlibで (9月 18, 2010)">ドロネー三角形 matplotlibで</a> (0)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://boxheadroom.com/2009/02/20/pygame_avi_save/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

