Nautilus のサムネイルはスマホの縦画像は縦に表示される。
けれど cbz にアーカイブすると横向きになってしまうようだ。
iPhoneからアップロードしたJPEG写真が横向きになる問題(EXIF, Orientation) – Qiita
つまりスマホで撮影した写真は実は全部横向き。
EXIF 情報によりアプリ側が縦表示等に回転しているというだけの話。
アプリ側がそういう処理をしていないとそのまま表示される。
回転情報を得るにはこの EXIF 情報を得る必要がある。
GNOME は Exiv2 というライブラリがあり GExiv2 が GIR で提供されている。
Exiv2 – Image metadata library and tools
ghiro/gexiv.py at master ? Ghirensics/ghiro ? GitHub
GExiv2.Metadata – Classes – GExiv2 0.10
コレを参考に cbz アーカイブ内の画像からも取得してみる。
#!/usr/bin/env python3 import os, gi gi.require_version('GExiv2', '0.10') from gi.repository import GExiv2, Gio FILENAME1 = os.path.expanduser('~/pic/exiv/IMG_0182.JPG') FILENAME2 = os.path.expanduser('~/pic/exiv/cbz.cbz') # filename metadata = GExiv2.Metadata() metadata.open_path(FILENAME1) n = metadata.get_orientation() print(n) # cbz cmd_array = ['unzip', '-pj', FILENAME2, 'IMG_0182.JPG'] sp = Gio.Subprocess.new(cmd_array, Gio.SubprocessFlags.STDOUT_PIPE | Gio.SubprocessFlags.STDERR_MERGE) stream = sp.get_stdout_pipe() # GUnixInputStream fd = stream.get_fd() with open(fd, 'rb') as f: metadata2 = GExiv2.Metadata() metadata2.open_buf(f.read()) n = metadata2.get_orientation() print(n)
GIR でアーカイブ内のバイナリ指定は迷ったけど上記でイケた。
Python の open ってファイルディスクリプタ指定でもイケるんだ。
GSubprocess を使ったけど subprocess モジュールでも同じだと思う。
で、とにかく値を得たら
gdk_pixbuf_rotate_simple
gdk_pixbuf_flip
で回転やフリップすればスマホ写真には対応できる。
ただ、この処理が cbz ビューアに必要かどうかは微妙。