顕微鏡の画像データが蓄積してきているが、いまいち整理されてなくて、バラバラにCD-Rとかに保存されているので一元管理したい。
できればサムネイル付きでカタログ化しておいて、目的の画像をパラパラっと見つけ出せるようであればなお良い。
ということでまず画像の在り処をリストアップする方法から。
./pictures /.DS_Store /200101 /otaku.png /otaku_tshirt_man.png /200201 /clover_itsutsuba.png /plant_chlamydomonas.png /tree_sequoia.png /200301 /.DS_Store /fantasy_bird_yatagarasu.png /youkai /youkai_amabiko.png /youkai_nurikabe.png /200401 /pet_darui_cat.png /shigoto_zaitaku_cat_man.png /200501 /chikyu_inseki_syoutotsu.png /kaseki_kohaku_bug.png /tokusatsu_kaiju_blue.png
こういう構成で保存されているとする。(ちなみに画像はいらすとやからもらってきた画像)
かわいいフリー素材集 いらすとや
import os dir = "./pictures" files = os.walk(dir) for dirpath, dirs, files in files: for f in files: print(os.path.join(dirpath, f))
こうすると以下のように返ってくる。
./pictures/.DS_Store ./pictures/200101/otaku.png ./pictures/200101/otaku_tshirt_man.png ./pictures/200201/clover_itsutsuba.png ./pictures/200201/plant_chlamydomonas.png ./pictures/200201/tree_sequoia.png ./pictures/200301/.DS_Store ./pictures/200301/fantasy_bird_yatagarasu.png ./pictures/200301/youkai/youkai_amabiko.png ./pictures/200301/youkai/youkai_nurikabe.png ./pictures/200401/pet_darui_cat.png ./pictures/200401/shigoto_zaitaku_cat_man.png ./pictures/200501/chikyu_inseki_syoutotsu.png ./pictures/200501/kaseki_kohaku_bug.png ./pictures/200501/tokusatsu_kaiju_blue.png
一方、イメージファイルの一覧をHTMLファイルにカタログとして作るプログラムとして次のようなものを見つけた。
import os from PIL import Image pic_dir = './pictures/200101/' filenames = os.listdir(pic_dir) imgl=[] ww=[] hh=[] for fname in sorted(filenames): path, ext = os.path.splitext( os.path.basename(fname) ) if ext=='.png' or ext=='.jpg' or ext=='.tiff' and path[0:2]!='._': pic=path+ext im=Image.open(pic_dir + pic) w=im.size[0] h=im.size[1] print(pic, w, h) imgl=imgl+[pic] ww=ww+[w] hh=hh+[h] f=open(pic_dir+'test1.html','w') print('<html>',file=f) print('<body>',file=f) print('<table>',file=f) n=len(imgl) m=int(n/5)+1 k=-1 for i in range(0,m): print('<tr>',file=f) for j in range(0,5): k=k+1 if k<=n-1: pic=imgl[k] w1=200 h1=int(hh[k]/ww[k]*200) print('<td align="center"><img src="'+pic+'" alt="pic" width="'+str(w1)+'", height="'+str(h1)+'"><br><a href="'+pic+'">I'+pic+'<a></td>',file=f) else: print('<td></td>',file=f) print('</tr>',file=f) print('</table>',file=f) print('</body>',file=f) print('</html>',file=f) f.close()
これで画像ディレクトリ内の画像をそのディレクトリにhtmlでカタログ化できる。サムネイルは画像ファイルとしては生成せず、表示を小さくしているだけなので、ファイルサイズがでかくなってくると問題が生じるかもしれない。
1行に5画像まで並ぶ一覧が生成される。
import os from PIL import Image dir = "./pictures" files = os.walk(dir) for dirpath, dirs, files in files: pic_dir = dirpath +'/' filenames = os.listdir(pic_dir) imgl=[] ww=[] hh=[] for fname in sorted(filenames): path, ext = os.path.splitext( os.path.basename(fname) ) if ext=='.png' or ext=='.jpg' or ext=='.tiff' and path[0:2]!='._': pic=path+ext im=Image.open(pic_dir + pic) w=im.size[0] h=im.size[1] print(pic, w, h) imgl=imgl+[pic] ww=ww+[w] hh=hh+[h] f=open(pic_dir+'list.html','w') print('<html>',file=f) print('<body>',file=f) print('<table border="1">',file=f) n=len(imgl) m=int(n/5)+1 k=-1 for i in range(0,m): print('<tr>',file=f) for j in range(0,5): k=k+1 if k<=n-1: pic=imgl[k] w1=200 h1=int(hh[k]/ww[k]*200) print('<td align="center"><img src="'+pic+'" alt="pic" width="'+str(w1)+'", height="'+str(h1)+'"><br><a href="'+pic+'">I'+pic+'<a></td>',file=f) else: print('<td></td>',file=f) print('</tr>',file=f) print('</table>',file=f) print('</body>',file=f) print('</html>',file=f) f.close()
これで各フォルダにそのフォルダに含まれる画像リストを生成する。
あとはフォルダへのリンクをどうにかすればとりあえずのカタログ化は完成なわけだ。
import os from PIL import Image dir = "./pictures" files = os.walk(dir) dp=[] for dirpath, dirs, files in files: pic_dir = dirpath +'/' filenames = os.listdir(pic_dir) imgl=[] ww=[] hh=[] for fname in sorted(filenames): path, ext = os.path.splitext( os.path.basename(fname) ) if ext=='.png' or ext=='.jpg' or ext=='.tiff' and path[0:2]!='._': pic=path+ext im=Image.open(pic_dir + pic) w=im.size[0] h=im.size[1] print(pic, w, h) imgl=imgl+[pic] ww=ww+[w] hh=hh+[h] f=open(pic_dir+'list.html','w') print('<html>',file=f) print('<body>',file=f) print('<table border="1">',file=f) n=len(imgl) m=int(n/5)+1 k=-1 for i in range(0,m): print('<tr>',file=f) for j in range(0,5): k=k+1 if k<=n-1: pic=imgl[k] w1=200 h1=int(hh[k]/ww[k]*200) print('<td align="center"><img src="'+pic+'" alt="pic" width="'+str(w1)+'", height="'+str(h1)+'"><br><a href="'+pic+'">I'+pic+'<a></td>',file=f) else: print('<td></td>',file=f) print('</tr>',file=f) print('</table>',file=f) print('<a href="../list.html">back</a><br>',file=f) p=len(dirs) r=-1 for q in range(0,p): r=r+1 dpath=dirs[r] print('<a href="'+dpath+'/list.html">'+dpath+'</a><br>',file=f) print('</body>',file=f) print('</html>',file=f) f.close()
なおここまでは静的なHTMLファイルでの方法なので、Flaskで動的なサイトを作るにはもうちょっと作り込みが必要。
このあと追加したい機能
SQLとの連携
画像ダウンロード
一括ダウンロード
一括アップロード&自動カタログ生成
ImageJSを組み込んでWeb上で画像解析できるようにする。