LInux上で動くマンガビュアー その2

LInux上で動くマンガビュアーを作ったの続き。

最初からコードを書き直した。
タブを除去しパネルの再描写に変更したら随分軽くなった。PILの処理速度は相変わらず。
サムネイル一覧の表示に時間がかかるので、再描写は極力控えるようにした。

マルチスレッドで

  1 # thread test
  2 # encoding: utf-8
  3 import thread
  4 import time
  5 n = 0
  6 
  7 def func():
  8         global n
  9         while 1:
 10                 n += 1
 11                 if n > 100:
 12                         break
 13                 print "call func", n
 14 #               time.sleep(0.05)
 15 
 16 def main():
 17         while 1:
 18                 if n > 100:
 19                         break
 20                 print "call main", n
 21 #               time.sleep(0.05)
 22 
 23 thread.start_new_thread(func,())
 24 main()

実行するとターミナルではこのように表示される。

call main 0
call main 0
call main 0
call func 1
call func 2
call func 3

これだとmainの後にfuncを処理してるかのように見える。
実際はマルチスレッドとして動作しているが、なんか誤解しそう。
14と21行目でtime.sleepを行ったら思惑通りに表示された。

call main 0
call func 1
call main 1
call func 2
call main 2

原因はなんだろう。ターミナルの問題ならいいのだが。

そういえば

これって確か正常な動作のはず。wait()でレンダリング走らせるとか常識だったような。

続きを読む

LInux上で動くマンガビュアーを作った

WinとMacでも動くけど、最近Linuxの出番が多いので。

安定性は皆無なんで機能追加と一緒に追々改良するとして、コア部はとりあえず完成。
元の画像ソースが大きいと表示に時間がかかるっぽい。
2カラムのビューはページが変わる毎に「ページ削除→ページInsert」という地味な処理を行ってる。
パネルの再描写ができれば一番いいんだが、どうも上手く書けない。
色々と改善の余地はありそうだ。製作時間は半日くらい。

タブで閲覧できるのは便利。
絶望先生は別に趣味とかじゃありません。

wxPythonとPILを使って縮小した画像を綺麗に表示

最初にwxImage(wxPythonのwx.Image)を使って画像を縮小したんだが、どうも画質が悪い(ギザギザ)。
アンチエイリアス機能がなく、ぼかしを入れても所詮は気休め。

PILならアンチエイリアスを指定できるので、PILで画像を縮小させてからwx.image.ConvertToBitmap()に画像データを渡せばいいんじゃないの。
というわけで。

# PILで画像を読み込む
image_pil = Image.open(image_path)
image_pil.thumbnail((640,480), Image.ANTIALIAS)

# wxPythonに縮小した画像を渡す
image_wx = wx.EmptyImage(image_pil.size[0],image_pil.size[1])
image_wx.SetData(image_pil.convert('RGB').tostring())
wx.StaticBitmap(root, -1, image_wx.ConvertToBitmap(), (0,0), (640,480))

PILのthumbnailは比率を維持したまま変換できるので大変楽です。Image.ANTIALIASが肝心のアンチエイリアス指定。
wxPythonに縮小後の画像データを渡したら、あとはwx.StaticBitmapでrootフレームに表示します。

違いがはっきり分かるくらい、アンチエイリアスの有無で随分変わる。