51644


以下のコードでファイルに入っている画像を順に並べて１枚の画像にしたいです。  
（5×9）枚で画像枚数は42~50で枠が足りなくてもあふれても最初の１枚目からから最高４５枚だけ出力させたいです。  
問題としてはIndexError: list index out of rangeが出てしまいます。  
よろしくお願いします。  
[![コード](https://i.stack.imgur.com/ooQ0S.png)](https://i.stack.imgur.com/ooQ0S.png)


CC BY-SA 4.0
2019-01-01T03:52:08.133
51641
2019-01-01T07:27:34.527
31634
question
python3 画像 array
pythonでファイルに入っている複数枚の画像をn×mで連結して、１枚の画像として出力したいです


動作確認はしていませんが、ご質問のフォーマットに合わせるとこんな感じですかね。  
イメージファイルの数を取得しておいて、それ以上になったらbreakでループを抜けます。  
最低1個のイメージファイルが必要です。

[code]

    from PIL import Image
    
    import numpy as np
    import cv2, os, glob
    
    fn = glob.glob('\\Users\y\Desktop\resize\*.jpg')
    l = len(fn)
    k = 0
    for i in range(5):
        for j in range(9):
            if k >= l:break
            im = np.array(Image.open(fn[k]))
            if j == 0:im1 = im
            else:im1 = np.hstack((im1,im))
            k += 1
        if i == 0:im2 = im1
        else:im2 = np.vstack((im2,im1))
        if k >= l:break
    cv2.imwrite('\\Users\y\Desktop\stack.jpg', im2)
    
[/code]

* * *

@metropolisさんの指摘を受けて、あらかじめダミーのブランクイメージをファイルなり  
何かの処理で初期化したデータなりで準備して、残り位置に穴埋めすれば良いのでは？  
以下はファイルで用意した例となるでしょう。

[code]

    from PIL import Image
    
    import numpy as np
    import cv2, os, glob
    
    blank = np.array(Image.open('blank.jpg'))
    fn = glob.glob('\\Users\y\Desktop\resize\*.jpg')
    l = len(fn)
    k = 0
    for i in range(5):
        for j in range(9):
            if k < l:im = np.array(Image.open(fn[k]))
            else:im = blank.copy()
            if j == 0:im1 = im
            else:im1 = np.hstack((im1,im))
            k += 1
        if i == 0:im2 = im1
        else:im2 = np.vstack((im2,im1))
        if k >= l:break
    cv2.imwrite('\\Users\y\Desktop\stack.jpg', im2)
    
[/code]


CC BY-SA 4.0
2019-01-01T06:14:54.733
51644
2019-01-01T07:27:34.527
2019-01-01T07:27:34.527
26370
26370
51641
answer