もったかぶった

プログラミングをしたりしなかったり

おしゃれに紙を並べたくて2

要約

前回は画像を並べるところまでやりました。

tmottat.hatenablog.com

f:id:TmottaT:20200618205204p:plain
味気ない…

今回はおしゃれ画角で画像を保存するところまでやります。

ソースコード全文。

github.com

挨拶

こんにちはたもったです。
今回の開発で初めてjupyter notebookを使ってみたのですが便利さにびっくりしました。Pythonはjupyter notebookで開発するように作られた言語だった…
ただ、僕の開発の仕方が悪かったのか、まとめる段階で不整合が出てきて大変でした。Pythonみたいな高級言語を使うときは変に実行速度なんか意識せずにこまめにアウトプット→参照を繰り返した方が開発時間が短縮できて相性が良さそうですね。

本文

PDFを画像にする前編と画像に画角をつけておしゃれにする後編に分けます。今回は後編です。
前回に引き続き、下の流れで画像を生成します。

  1. PDFの各ページを画像に変換する

  2. 各ページ画像に影を付ける

  3. 影付きの画像を縦横並べる

  4. 縦横並べた画像を斜めから撮影しておしゃれ画像にする。 👈今ここ

前回は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')

画像を保存すると、

f:id:TmottaT:20200617015118p:plain
おしゃ画像が生成された

これで皆さんも簡単におしゃ紙並べ画像が作れます。
HPのヘッダにするもよし、自分の論文を強そうに表示するもよし。自由気ままなあなたのおしゃ紙並べライフの始まりです。
僕はこれからこのスクリプトの使い道を考えていきたいと思います。

終わり

自分は昔OpenGLを学校の課題や研究室で触ったことがあるはずなのですが、全く覚えていなくて表示設定などえらく手間取りました。
そんな忘れん坊のあなたも初めてOpenGLを触るあなたも、手抜きOpenGLがおすすめです。

tokoik.github.io

今更気づいたのですが、手抜きOpenGLってgithub.ioなんですね。全く気付かなかった。