2
1

More than 3 years have passed since last update.

Random Dot Stereogram

Last updated at Posted at 2020-06-02

ランダムドット・ステレオグラムを描画するプログラムをpythonで書きました。
とは言っても、ランダムな点でステレオの図を描画するだけのジョークプログラムですので、
真面目な人は怒らないで下さい。ランダムな点で構成された途中画像をいくら見ても、3D画像は浮き上がりません。
ubuntu20.04では、pip3でpygameがインストールできなかったので、sudo apt-get install python3-pygame python3-numpyとして、pygameをインストールしました。以下のコードを、コピー&ペーストして、適当なディレクトリに置き、実行権限を付けて、同じディレクトリに*ここ*にある画像ファイルを置いて、実行して下さい。
種明かしをすると、ファイルネームにどんな画像を指定しても、ランダムドットで表示されます。詳細は、コードを参照して下さい。
僕のpythonで初めてのグラフィック処理のため、初学者覚書を兼ねてです。

rdsg.py
#!/usr/bin/python3
from pygame.locals import * # pygameイベント処理のため
import pygame               # pygame
import time                 # sleepのため
import random               # シャッフルのため

pygame.init()                #pygameを使う際には必ず最初にinit()を呼びます

filename = 'stereogram.jpg'  #画像のファイルネーム

dummyscreen=pygame.display.set_mode((1,1),0,32) #image.load().convertを先に呼ぶとエラーが出るので、ダミーの呼び出しをします。

img=pygame.image.load(filename).convert() #ファイルの読み込み

xsize = img.get_width() # 画像の幅の取得
ysize = img.get_height() # 画像の高さの取得 

screen=pygame.display.set_mode((xsize,ysize),0,32) # ディスプレイをするスクリーンを、画像の幅、高さで再設定

surface=pygame.Surface((xsize,ysize)) # 元画像を描くサーフェスを設定
surface.blit(img,(0,0)) # 元画像を描く

# 元画像のサーフェスと、ディスプレイするスクリーンのサイズは一致していて、
# それぞれ全ての点が1対1対応します

ns = [i for i in range(xsize*ysize)] # 画面上の全ての点に順番を付けます
random.shuffle(ns) # 点の順番をシャッフルします これで、重複しない乱数列が出来ます

for cnt in range(xsize*ysize): # 画面の点の個数ループ。全部点を打ったら抜けます

    for event in pygame.event.get(): # pygame QUITイベントが出たら、終了
        if event.type == QUIT:
            exit()

    pos=divmod(ns.pop(0),ysize) # 打つ点の座標を、乱数から求めます
    # 幅掛ける高さなので、高さで割り、商と余りをそれぞれ、x,y座標とします

    col=surface.get_at(pos) # 元画像のサーフェスから、(x,y)における色を取得します。ピクセルの色の取得は、surface.get_at()でやります。
    screen.set_at(pos,col) # スクリーンに、位置pos、色colで点を打ちます

    pygame.display.update() # スクリーンをアップデートします

time.sleep( 20 ) # ループを抜けたら、20秒間ウエイトをします

# 終わり

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1