2017-09-25 6 views
0

ディレクトリ内のすべてのファイル(101個のファイルは既に0.jpgから100.jpgまで順番に並べられています)を開くプログラムをコーディングしていますそのファイルを比率に基づいてサイズ変更した後、列挙されたforループのインデックスに従って出力を別のディレクトリに保存します。なぜ私のインデックスとファイル名が一致しないのか混乱しています。 forループのインデックスは0から100までで、ファイル名も同じです。 forループは、0から100までの順番でソースイメージファイルを呼び出し、インデックスのためにそれらを順番に保存する必要があります。PIL画像が間違った順序で保存されています(ループ用、列挙型インデックス)

しかし、プログラムを実行すると、ソースイメージ100(サイズ変更されたイメージのサイズが最も大きいイメージ)は3.jpgとして保存され、4番目に小さいイメージになりました。イメージ3は、イメージ24となりました。しかし、より大きな画像では、順序は正しい。私もファイルをソートすることを確認しました

os.makedirs("resized images") 
try: 
    files = os.listdir(os.path.join(os.getcwd(),"source images")) 
except IOError: 
    print('No folder found.') 
    input('Enter any key to exit: ') 
    exit() 

xDimension=dimensions[0] 
yDimension=dimensions[1] 
print(xDimension) 
print(yDimension) 
totalViews=0 
for item in d: 
    totalViews+=d[item] 
files.sort() 
for index, file in enumerate(files): 
    path = os.path.join(os.getcwd(), "source images", file) 
    img = Image.open(path) 
    ratio=(d[index]/totalViews) 
    print(ratio) 
    print(str(index)) 
    resizedX=int(math.ceil((xDimension*ratio))) 
    resizedY=int(math.ceil((yDimension*ratio))) 
    resized=img.resize((resizedX, resizedY)) 
    resized.save("resized images/"+str(index)+".jpg", 'JPEG') 
#image 100 in source images becomes image 3 in resized images, making image 3 become image 24 

は、ここに私のコードです。比率とインデックスはすべて正しく印刷されます。ここで何が起こっていますか?

+0

files.sort()の前に(ファイル)を印刷するとどうなりますか?後に(ファイル)を印刷するとどうなりますか? – Hugo

答えて

1

os.listdir正しくソートされたararyを返さないことがあります。配列を反復処理する前に、配列をソートする必要があります。これを行うより良い方法は、イテレータの代わりに元のファイル名を使用することです。
array.sort()関数を使用する次のコードを試すことができます。

try: 
    files = os.listdir(os.path.join(os.getcwd(),"source images")) 
    files.sort() 
except IOError: 
    print('No folder found.') 
    input('Enter any key to exit: ') 
    exit() 

私は自分のコンピュータでコードをテストしている26/9/2017
に更新。私はsort()で間違いを見つけました。
ここで、反復を通じてパラメータを出力するコンソールがあります。

file = 0.png 
index = 0 

file = 1.png 
index = 1 

file = 10.png 
index = 2 

file = 11.png 
index = 3 

file = 12.png 
index = 4 

file = 13.png 
index = 5 

file = 14.png 
index = 6 

file = 2.png 
index = 7 

file = 3.png 
index = 8 

sort()機能の意志の問題は、関数は常に文字列で文字を比較することです。したがって、結果はインデックスと一致しません。
私はあなたのコードを少し変更しました。それは私のコンピュータで期待される結果を生み出すために働く。

for index, file in enumerate(files): 
    path = os.path.join(os.getcwd(), "source images", file) 
    img = Image.open(path) 
    # do your operation 
    # Use the file name itself instead of the index 
    img.save("resized images/"+ file, 'JPEG') 
+0

ようこそ!答えで質問しないでください。できるだけ明確かつ簡潔に、可能であれば必要な場合にはコードを提供してください。 – wp78de

+0

ありがとうございます。私は後でそれを編集します。気にして申し訳ありません。 –

+0

私は実際に元のファイル名を使用する必要があるかもしれませんが、私はすでにfiles.sort()でコード内のファイルをソートしましたが、同じ壊れた結果が生成されます。 –

関連する問題