kuroの覚え書き

96の個人的覚え書き

画像をカタログ化して共有する

顕微鏡の画像データが蓄積してきているが、いまいち整理されてなくて、バラバラに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画像まで並ぶ一覧が生成される。
f:id:k-kuro:20201025173553p:plain

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()

f:id:k-kuro:20201025202410p:plain
なおここまでは静的なHTMLファイルでの方法なので、Flaskで動的なサイトを作るにはもうちょっと作り込みが必要。
このあと追加したい機能
SQLとの連携
画像ダウンロード
一括ダウンロード
一括アップロード&自動カタログ生成
ImageJSを組み込んでWeb上で画像解析できるようにする。