GExiv2

Nautilus のサムネイルはスマホの縦画像は縦に表示される。
けれど cbz にアーカイブすると横向きになってしまうようだ。

orientation1

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)

orientation2

GIR でアーカイブ内のバイナリ指定は迷ったけど上記でイケた。
Python の open ってファイルディスクリプタ指定でもイケるんだ。
GSubprocess を使ったけど subprocess モジュールでも同じだと思う。
で、とにかく値を得たら

gdk_pixbuf_rotate_simple
gdk_pixbuf_flip

で回転やフリップすればスマホ写真には対応できる。
ただ、この処理が cbz ビューアに必要かどうかは微妙。