おしゃれに紙を並べたくて2
要約
前回は画像を並べるところまでやりました。
今回はおしゃれ画角で画像を保存するところまでやります。
ソースコード全文。
挨拶
こんにちはたもったです。
今回の開発で初めてjupyter notebookを使ってみたのですが便利さにびっくりしました。Pythonはjupyter notebookで開発するように作られた言語だった…
ただ、僕の開発の仕方が悪かったのか、まとめる段階で不整合が出てきて大変でした。Pythonみたいな高級言語を使うときは変に実行速度なんか意識せずにこまめにアウトプット→参照を繰り返した方が開発時間が短縮できて相性が良さそうですね。
本文
PDFを画像にする前編と画像に画角をつけておしゃれにする後編に分けます。今回は後編です。
前回に引き続き、下の流れで画像を生成します。
PDFの各ページを画像に変換する
各ページ画像に影を付ける
影付きの画像を縦横並べる
縦横並べた画像を斜めから撮影しておしゃれ画像にする。 👈今ここ
前回はmakeImageFromPdf.pyの説明でした。 今回はmakeTileImage.pyの説明です。
4.各ページ画像に影を付ける
OpenGLを使います。
本当は自前でカメラビューっぽく見えるように画像の射影変換をすればよいのです。よいのですが僕には難しかったのでOpenGLのパワーを使っていきたいと思います。
それまでの処理をPythonでやっていたのでここもPyOpenGLを使っていきます。
といっても人様のコードを使いまくっているのであまり説明するところはありません。
テクスチャ作り
画像パスを指定してテクスチャを生成します。
def img2tex(img_path): img = Image.open(img_path) img = img.convert('RGBA') img_data = img.tobytes() tex = glGenTextures(1) glBindTexture(GL_TEXTURE_2D, tex) glTexImage2D( GL_TEXTURE_2D, #target 0, #level GL_RGBA, #internalformat img.size[0], img.size[1], #width, height 0, #border GL_RGBA, #format GL_UNSIGNED_BYTE, #type img_data #pixels ) return tex
画角の設定
gluLookAtで画角を決めています。
def resizeA(w, h): glViewport(0, 0, w, h) glLoadIdentity() gluPerspective( 1.0, #fovy 1.0, #aspect 0.0, 10.0 #zNear, zFar ) glRotated(40.0, 0.0, 0.0, 1.0) # 画角を編集したい場合はここをいじります gluLookAt( -7.0, -11.0, 16.0, #eye 0.4, 0.4, 0.0, #center 0.0, 1.0, 0.0 #up )
画像の保存
マウスの左クリックで画像を保存します。
def mouse(button, state, x, y): if button == GLUT_LEFT_BUTTON: glReadBuffer(GL_FRONT) buf = glReadPixels( 0 ,0, #x, y 1000, 1000, #width, height GL_RGBA, #format GL_UNSIGNED_BYTE, #type ) img = Image.frombuffer('RGBA', (1000, 1000), buf) img.save('OshaTile.png')
画像を保存すると、
これで皆さんも簡単におしゃ紙並べ画像が作れます。
HPのヘッダにするもよし、自分の論文を強そうに表示するもよし。自由気ままなあなたのおしゃ紙並べライフの始まりです。
僕はこれからこのスクリプトの使い道を考えていきたいと思います。
終わり
自分は昔OpenGLを学校の課題や研究室で触ったことがあるはずなのですが、全く覚えていなくて表示設定などえらく手間取りました。
そんな忘れん坊のあなたも初めてOpenGLを触るあなたも、手抜きOpenGLがおすすめです。