写真を回転させてみよう
今回は写真を回転させてみましょう。
写真を回転させるには、ピクセルの並びを変更します。
画面オブジェクトを2つ用意して、写真をロードした画面オブジェクトを元に、ピクセルの並びを変えながらもうひとつの画面オブジェクトにコピーします。
写真を上下逆にするプログラム
写真の上下を逆にするには、以下のようにピクセルを入れ替えます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
### インポート import pygame from pygame.locals import * ### 定数 WIDTH = 640 # 幅 HEIGHT = 400 # 高さ ### モジュール初期化 pygame.init() ### 画面設定 surface = pygame.display.set_mode((WIDTH,HEIGHT)) ### 写真読み込み(コピー元画面オブジェクト) src = pygame.transform.rotozoom(pygame.image.load("photo.jpg").convert(), 0, 0.2) ### コピー先画面オブジェクト dst = pygame.Surface(surface.get_size(), 0, surface) ### 画像サイズ保存 img_w = src.get_width() img_h = src.get_height() ### 写真のピクセルを直接編集 pixel_src = pygame.PixelArray(src) pixel_dst = pygame.PixelArray(dst) ### Y座標、X座標の色を取得 for y in range(img_h): for x in range(img_w): ### ピクセル位置変更 pixel_dst[(img_w-1)-x][(img_h-1)-y] = pixel_src[x][y] ### オブジェクト削除 del pixel_src, pixel_dst ### 写真表示 surface.blit(dst, (int((WIDTH-img_w)/2),int((HEIGHT-img_h)/2))) ### 画面更新 pygame.display.update() ### 無限ループ while True: ### イベント処理 for event in pygame.event.get(): if event.type == KEYDOWN and event.key == K_ESCAPE: break else: continue ### whileループ終了 break ### 終了処理 pygame.quit() |
プログラムを実行すると、以下の画像が表示されます。
なお、写真の左右だけを反転するには、以下のようにX軸のピクセルのみ入れ替えます。
1 |
pixel_dst[(img_w-1)-x][y] = pixel_src[x][y] |
プログラムを実行すると、以下の画像が表示されます。
写真を90度回転させるプログラム
写真を90度回転させるには、以下のようにピクセルを入れ替えます。
写真は縦と横の長さが違うので、180度回転させるより若干難しくなります。
X軸の並びがY軸の並びになることに注意してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
### インポート import pygame from pygame.locals import * ### 定数 WIDTH = 400 # 幅 HEIGHT = 640 # 高さ ### モジュール初期化 pygame.init() ### 画面設定 surface = pygame.display.set_mode((WIDTH,HEIGHT)) ### 写真読み込み(コピー元画面オブジェクト) src = pygame.transform.rotozoom(pygame.image.load("photo.jpg").convert(), 0, 0.2) ### コピー先画面オブジェクト dst = pygame.Surface(surface.get_size(), 0, surface) ### 画像サイズ保存 img_w = src.get_width() img_h = src.get_height() ### 写真のピクセルを直接編集 pixel_src = pygame.PixelArray(src) pixel_dst = pygame.PixelArray(dst) ### Y座標、X座標の色を取得 for y in range(img_h): for x in range(img_w): ### ピクセル位置変更 pixel_dst[(img_h-1)-y][x] = pixel_src[x][y] ### オブジェクト削除 del pixel_src, pixel_dst ### 写真表示 surface.blit(dst, (int((WIDTH-img_h)/2),int((HEIGHT-img_w)/2))) ### 画面更新 pygame.display.update() ### 無限ループ while True: ### イベント処理 for event in pygame.event.get(): if event.type == KEYDOWN and event.key == K_ESCAPE: break else: continue ### whileループ終了 break ### 終了処理 pygame.quit() |
プログラムを実行すると、以下の画像が表示されます。