質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

1514閲覧

画像の一括処理方法(フォルダからの読み込み→クロップ→リネーム→別フォルダへ保存)

maumau

総合スコア1

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/08/13 08:11

前提・実現したいこと

フォルダ内の「in-000.png」から始まる50枚の画像を一括で読み込み、指定したサイズでクロップ、各ファイル名を「out-000.png」にリネーム(連番部分は変更しない)、別フォルダに保存したいです。

Python歴1週間です。
どうか下記の問題が起きている原因と解決策を分かりやすく教えていただけないでしょうか。

発生している問題・エラーメッセージ

別フォルダが作成され、フォルダ内にファイルが作られますが、そのファイルの様子が変です。
望んでいるのは「out-000.png」から「out-049.png」の50個の画像ファイルですが、「out-{0」というファイルが1個あるのみです。

for文に問題があると踏んでいます。

該当のソースコード

Python

1import os 2import glob 3from PIL import Image 4 5in_dir = "/Users/images" 6out_dir = "/Users/edited images" 7os.makedirs(out_dir, exist_ok=True) 8 9assert(os.path.exists(in_dir)), "directory '{}' not found".format(in_dir) 10for path in glob.glob(in_dir + "/*.png"): 11 in_img = Image.open(path) 12 13 box = (700, 700, 1500, 2100) 14 out_img = in_img.crop(box) 15 16 save_path = os.path.join(out_dir, 'out-' + '{0:03d}' + '.png') 17 out_img.save(save_path)

Python

1for i, path in glob.glob(in_dir + "/*.png"): 2 in_img = Image.open(path) 3 4 box = (700, 700, 1500, 2100) 5 out_img = in_img.crop(box) 6 7 save_path = os.path.join(out_dir, 'out-' + '{0:03d}'.format(i) + '.png') 8 out_img.save(save_path)

試したこと

・1つ目のコードについて
https://teratail.com/questions/183726
こちらの質問に対する回答をベースにコードを書きました。

・2つ目のコードについて
1つ目のfor文部分を抜き出しています。
for文に問題があると考えたので、うまく回るようにiを追加し、ファイル名の指定にformat(i)を追加しました。
エラーが表示され、「ValueError: too many values to unpack (expected 2)」とのことです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

ファイル名が決っているなら、globを使う必要はありません。
以下のように名前を生成すればよいでしょう。

python

1>>> in_dir = "/Users/images" 2>>> out_dir = "/Users/edited images" 3>>> 4>>> N = 5 5>>> 6>>> for i in range(N): 7... print(f'{in_dir}/in-{i:03}.png') 8... print(f'{out_dir}/in-{i:03}.png') 9... 10/Users/images/in-000.png 11/Users/edited images/in-000.png 12/Users/images/in-001.png 13/Users/edited images/in-001.png 14/Users/images/in-002.png 15/Users/edited images/in-002.png 16/Users/images/in-003.png 17/Users/edited images/in-003.png 18/Users/images/in-004.png 19/Users/edited images/in-004.png

公式マニュアル 2.4.3. フォーマット済み文字列リテラル
Pythonで文字列・数値をゼロ埋め(ゼロパディング)
などをお読みください。

投稿2021/08/13 10:45

編集2021/08/13 11:01
ppaul

総合スコア24666

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ファイル名の変更はreplace()を用いてはどうでしょうか?

Python

1import os 2 3out_dir = "/Users/edited images" 4 5for path in ['/Users/images/in-000.png', '/Users/images/in-001.png']: 6 save_path = os.path.join(out_dir, os.path.basename(path).replace('in', 'out')) 7 print(save_path) 8 9#/Users/edited images/out-000.png 10#/Users/edited images/out-001.png

投稿2021/08/13 08:42

meg_

総合スコア10580

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問