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

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

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

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

Python

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

Q&A

解決済

1回答

1442閲覧

画像をうまく切り出すことができない。python

dokidoki_hamuo

総合スコア38

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2019/06/18 02:13

編集2019/06/18 04:45

質問

カレントディレクトリにある2328×1314の画像を1280×960のサイズに切り出して保存する、というものを作成しています。

プログラム自体はエラーなく動き、できた画像も1280×960サイズでした。
ただ、指定した場所と違う場所で切り取っているので変な画像になります。

なぜこうなってしまうのか原因を教えて頂けないでしょうか。
よろしくお願いいたします。

Python 3.7.3
Windows7

該当のプログラム

python

1import os 2from PIL import Image 3myphoto =[] 4for filename in os.listdir('.'): 5 if filename.endswith('.jpg') or filename.endswith('.png'): 6 myphoto.append(filename) 7 8 for filename in myphoto: 9 pict = Image.open(filename) 10 cut_pict = pict.crop((524, 177, 1804, 1137)) 11 cut_pict.save(filename) 12 pict.close() 13 cut_pict.close()

追記

セキュリティーの問題でデータアップロードできないので、伝わるかどうかわかりませんが下記に記載します。

(1)2328×1314の画像があります。

□□□□□□□□□□
□□□□□□□□□□
□□□□□□□□□□
□□□□□□□□□□
□□□□□□□□□□
□□□□□□□□□□
□□□□□□□□□□
□□□□□□□□□□

(2)理想は黒部分を切り取りたい。
□□□□□□□□□□
□□□□□□□□□□
□□■■■■■□□□
□□■■■■■□□□
□□■■■■■□□□
□□■■■■■□□□
□□□□□□□□□□
□□□□□□□□□□

(3)インタラクティブシェルでやると(2)のようにうまくいくが、コマンドプロンプトから実行すると
□□□□□□□□□□
□□□□□□□□□□
□□□□□□□□□□
□□□□□□□□□□
□□□□□■■■■■
□□□□□■■■■■
□□□□□■■■■■
□□□□□■■■■■

別のところが切り出されてしまう。

この原因を教えて頂けないでしょうか。

違うパターンの切り出し

□□□□□□□□□□
□□□□□□□□□□
□□□□□□□□□□
□□□□□□□□□□
□□□□□■■■■■□
□□□□□■■■■■□
□□□□□■■■■■□
□□□□□■■■■■□
↑のようにはみでて切り出される時もあり、はみ出た部分は真っ黒でした。

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

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

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

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

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

tetsunosuke

2019/06/18 03:22

>指定した場所と違う場所で切り取っているので変な画像 どうしたくてどうなってほしいのかがわかりません。 実際の切り取られた画像等を明示してもらえますか?
dokidoki_hamuo

2019/06/18 04:31

タイトルを追記にしたところに記載しました。 よろしければ、ご確認いただけると助かります。
tetsunosuke

2019/06/18 04:35 編集

修正内容確認しました。意図は伝わりました。 思っていたよりも右下にずれているということなんですね。 その右下の四角形の左上の座標は (2328-1280, 1314-960) = (1058,354) になっているんですかね。 インタラクティブシェルとコマンドプロンプトで違うってのはちょっと理解し難いですがこれも新しい情報なので関係あるかもしれませんね。
dokidoki_hamuo

2019/06/18 04:43

すみません、切り出された画像の座標の取得方法がわかりませんので、座標がどの位置に来ているのか確認できませんでしたm(__)mちなみに切り出された画像の座標の取得方法はどのようにしたらわかりますか? ディレクトリに3つ画像いれてやってみたのですが、1つは成功して残りの2つはそれぞれ位置が違うとことから切り出されてしまいました。一気にやることが問題なのかとも思ったのですが、まだ原因がわかりませんでした。
tetsunosuke

2019/06/18 04:52

もとの画像の上に切り取られた画像を貼り付けて背景を消したりすれば測れると思いますが(他にも良い方法はあると思うけどひとまずできればなんでもいいかなって) ちなみにダミーデータはこちらで作ってみて試しました。 https://picsum.photos/ 連続してやることが問題だとしたら、 for filename in myphoto: こちらのインデントを一つ戻してみては? まずはディレクトリからのデータを探索して対象ファイル名をmyphotoに突っ込んで、 そのあとにmyphotoから逐次取り出す。
dokidoki_hamuo

2019/06/18 05:06

(1050、375)になってました!! >>まずはディレクトリからのデータを探索して対象ファイル名をmyphotoに突っ込んで、 そのあとにmyphotoから逐次取り出す。 見当違いな質問だったら申し訳ないのですが、↑にあたる部分が for filename in os.listdir('.'): if filename.endswith('.jpg') or filename.endswith('.png'): myphoto.append(filename) ではないのですか??
tetsunosuke

2019/06/18 06:25

> まずはディレクトリからのデータを探索して対象ファイル名をmyphotoに突っ込んで、 これが、 for filename in os.listdir('.'): if filename.endswith('.jpg') or filename.endswith('.png'): myphoto.append(filename) ってのは認識があってます。 それと同じループで、 > myphotoから逐次取り出す。 をやる必要はないのかなと思ったので。 (1050, 375) ってどうしたらそう計算されるんだろう...
tetsunosuke

2019/06/18 06:27

↑ の話を、インデントがわかりにくくなりそうだったので、回答として記入しました。
dokidoki_hamuo

2019/06/18 06:38

(1050, 375)はペイントに似たフリーソフトで、オリジナル画像と切り取った画像を重ねて、フリーソフトの定規目盛を目視して出した数字なので、若干アバウトな数値です!計算はしてません。失礼いたしましたm(__)m ご回答ありがとうございます!! >>こちらのインデントを一つ戻してみては? というヒントを元にやってみたらできました!!!! でも、理屈がわからなくて再度伺おうと思っていたところを >>保存したファイルを再度処理してしまっているとかで狂ったりするのかな と先にご回答していただいたので、おかげさまでスッキリ解決しました! 長々とありがとうございました。また機会がありましたらぜひよろしくお願いいたします。
tetsunosuke

2019/06/18 06:41

なるほど、目視で重ねたらまあそうなりますよね。自分も提案しておいて多少いかがなものかとは思ってました...汗 解決したのですね。回答に書いた内容で解決なのであれば、そちらで解決済みにしてもらえればOKです。
dokidoki_hamuo

2019/06/18 06:45

理屈を教えて頂いたのでベストアンサーとさせていただきました!!
tetsunosuke

2019/06/18 06:46

ありがとうございます!
guest

回答1

0

ベストアンサー

コードフォーマットが使えないのでこちらに書きます。

python3

1import os 2from PIL import Image 3myphoto =[] 4for filename in os.listdir('.'): 5 if filename.endswith('.jpg') or filename.endswith('.png'): 6 myphoto.append(filename) 7 8for filename in myphoto: 9 pict = Image.open(filename) 10 cut_pict = pict.crop((524, 177, 1804, 1137)) 11 cut_pict.save(filename) 12 pict.close() 13 cut_pict.close()

こうしたらどうかな?という意味でした。ないと思うんですけど保存したファイルを再度処理してしまっているとかで狂ったりするのかな?と。

投稿2019/06/18 06:26

tetsunosuke

総合スコア1292

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問