とある科学の備忘録

とある科学の備忘録

CやPythonのプログラミング、Arduino等を使った電子工作をメインに書いています。また、木製CNCやドローンの自作製作記も更新中です。たまに機械学習とかもやってます。

【Python】Pygameで画像を描画

今回は、Pygameを使って画像を描画するプログラムを書いてみました。

サンプルプログラム

from pygame.locals import *
import pygame
import sys

def main():
    pygame.init()    # Pygameを初期化
    screen = pygame.display.set_mode((400, 330))    # 画面を作成
    pygame.display.set_caption("Pygame sample app")    # タイトルを作成
    
    running = True
    #メインループ
    while running:
        screen.fill((0,0,0))  #画面を黒で塗りつぶす
       
        # 画像を描画
        #---------------  1.画像を読み込む  --------------------------
        
        #普通に画像を表示する方法
        img1 = pygame.image.load("img1.jpg")

        #一部の色を透明にする
        img2 = pygame.image.load("img2.jpg").convert()
        colorkey = img2.get_at((0,0))
        img2.set_colorkey(colorkey, RLEACCEL)
        
        #画像の大きさを変える
        img3 = pygame.image.load("img3.jpg")
        img3 = pygame.transform.scale(img3, (200, 130)) #200 * 130に画像を縮小
        
        #---------------  2.画像を表示  --------------------------
        screen.blit(img1, (20, 20))
        screen.blit(img2, (150,20))
        screen.blit(img3, (20, 170))
        
        pygame.display.update() #描画処理を実行
        for event in pygame.event.get():
            if event.type == QUIT:  # 終了イベント
                running = False
                pygame.quit()  #pygameのウィンドウを閉じる
                sys.exit() #システム終了
                
if __name__=="__main__":
    main()

上のプログラムを実行してください。
実行する際は、スクリプトファイルと同じ場所に「img1.jpg」、「img2.jpg」、「img3.jpg」を作成してください。

私の環境でテストしたときのimg1~3の画像を上げておきます。

img1 :
f:id:pythonjacascript:20190222224013j:plain

img2 :
f:id:pythonjacascript:20190222230806j:plain


img3 :
f:id:pythonjacascript:20190222224125j:plain

手元に画像がない場合は、↑の画像を「名前を付けて保存」して適当な場所に保存してから実行してください。

実行結果

このようになるはずです。
f:id:pythonjacascript:20190222230730j:plain
上の画像が3つ、正常に読み込まれて描画されていることがわかります。

解説

Pygameを使って、画面ウィンドウ上に画像を表示する方法について解説していきます。

対応フォーマット(拡張子)

Pygameでは、pygame.image.load()関数で画像を読み込みますが、load()関数が対応しているフォーマットは以下のものが対応しています。

  • JPG
  • PNG
  • GIF
  • BMP
  • PCX
  • TGA (非圧縮形式のみサポートしています)
  • TIF
  • LBM (and PBM)
  • PBM (and PGM, PPM)
  • XPM

GIFはアニメーションGIFはサポートしておらず、静止画のみが読み込み可能です。
image - Pygameドキュメント 日本語訳



概要

画像の読み込みは、2ステップで行うことができます。

#STEP1 画像を読み込み
img = pygame.image.load("img.jpg")

#STEP2 画像を表示
screen.blit(img, (100, 100))

まず、pygame.image.load("画像ファイル名")で画像を読み込みます。
上で紹介したように多くのフォーマットに対応しているので、この関数だけで十分でしょう。

この関数の返り値はSurfaceです。作成されたSurfaceは、読み込み元の画像のカラー形式、透明色、透明度を持っています。

また、引数を設定せずにSurface.convert()命令を実行することにより、現在の描写環境に最適化された形式へ変換したコピーを作ることができます。
透明化をするときにはconvert()関数を走らせましょう。

#convert()の書き方1
img = pygame.image.load("img.jpg").convert()

#convert()の書き方2
img = pygame.image.load("img.jpg")
img = img.convert()

 

特定の色を透明化する

Pygameの画像表示では、画像内のある一色を透明に設定することができます。

上のプログラムでは、以下の部分が該当します。

img2 = pygame.image.load("img2.jpg").convert()
colorkey = img2.get_at((0,0))
#colorkey = (255, 255, 255)
img2.set_colorkey(colorkey, RLEACCEL)

screen.blit(img2, (150,20))

画像の透明化を行う前に、convert()関数を実行して画像のSurfaceデータを最適化する必要があります。この作業は通常表示の時には必要ありません。

そして、set_colorkey(colorkey, RLEACCEL)関数で特定の色を透明化します。
第一引数にはカラーキーを入力します。カラーキーには、透明色にしたいRGB値を入れます。なので、

colorkey = img2.get_at((0,0))
colorkey = (255, 255, 255)

のどちらでも動作します。

img.get_at((x,y))関数は、imgの画像の(x, y)ピクセルの色を取得する関数です。

上のプログラムでは、

colorkey = img2.get_at((0,0))

と書いています。img2には手書きの「あ」の画像を使いましたが、この画像の(0,0)のピクセルの色は白なので(255,255,255)を返します。


あとは、screen.blit()関数を使って通常通り描画するだけです。
 

 

画像を拡大・縮小する

画像の表示の大きさをプログラムで変更することもできます。

画像の拡大・縮小には、pygame.transform.scale()関数を使用します。
第一引数は画像のSurface、第二引数にリサイズ後の画像サイズをピクセルで指定します。

img3 = pygame.transform.scale(img3, (200, 130)) 

このように書くと、img3を100*130px の大きさで表示します。

実際に、実行結果を見てみると、Arduinoの写真が100*130の大きさで表示されていることがわかります。