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

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

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

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

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

Q&A

1回答

5235閲覧

動的に画像を切り抜きたい

nto

総合スコア1438

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

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

0グッド

1クリップ

投稿2020/03/18 10:06

SNSなどのプロフ画像選択画面の様な動的なシステムを作りたい

下記イメージはgoogleのアカウントのプロフ写真設定の様子
画像中央にあるフレームをマウスで動的に操作し、移動する事ができて
また、ドラッグ操作でフレームのサイズも変更が可能
サイドボタンでは画像を90度ずつ左右に回転できる
イメージ説明

作りたいもの

上記イメージの様に、画像を読み込み

  • マウス操作でフレームカーソルを移動させられる
  • ドラッグ操作でフレームサイズを変更できる
  • フレーム内側部分の画像を切り出し、保存

この3点を抑えたシステムを作りたいと考えています。

作ったものはtkinterのGUIに埋め込み、GUI上で操作でき
また保存はGUI上にボタンを配置してボタンクリックで保存処理を行いたいと考えているのですが
作り方がイメージできず
アルゴリズムや、参考コードなどわかる方がいらっしゃればアドバイス・ご教示お願いします。

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

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

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

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

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

nanami12

2020/03/19 08:23

設計をするのもプログラミングの一部です。 設計もできないのなら、コーディングもむりでしょう
nto

2020/03/20 04:04 編集

そうですね、まだ独学でさわり2ヶ月程度の初学だったもので設計が出来ずすみませんでした
guest

回答1

0

内容が多岐に渡るので、足掛かりになりそうなところだけ

画像処理に関して

tkinterのPhotoImageクラスでは一部のファイルフォーマットにしか対応していないので、
一般的な jpeg ファイルを読み込み、tkinterへ画像を描画するためには
3rdパーティ製の画像処理ライブラリPIL(Pillow) の ImageTk を用います。

Tkinter で作成する必要がある部分

  • マウス操作でフレームカーソルを移動させられる
  • ドラッグ操作でフレームサイズを変更できる

アプリ内でウィジェットの Drag and Drop で移動は、tkinter.dnd が参考になります。
シェル(コマンドプロンプト等)で python -m tkinter.dnd と実行すると動作サンプルが見れます。
windowが複数現れて ICON というボタンをマウスで移動できます。

リサイズに関しても同様、応用で出来ますが、
(ドラッグ操作によりオブジェクトを「移動」させている部分を「サイズ変更」にする等)
具体的な処理はフレームの実装方法次第になります。

画像を切り取り保存 (PIL)

PILを用いて画像を加工するのが簡単で、サンプルコードも多く見つかるかと思います。
画像の範囲を切り取ることを「トリミング」や「クロッピング」といい、
PILでは Image.crop メソッドに範囲の座標を指定することで実現できます。


コードは長くなりそうなので、
実装手順の要約だけ書き残しておきます。

- PIL(Pillow)で画像処理 - 画像を読み込み tkinter の Canvas 上に表示 Image.open と ImageTk.PhotoImage を用います。 - 切り取り -> Image.crop() を使う - tkinter で画像の範囲指定をするフレーム(枠)を実装 - Step1: キャンバス上に枠を描画する create_reactangle - Step2: アイコンを配置してマウスで移動可能にする - ドラッグアンドドロップのイベント処理方法について - `<ButtonPress-1>`イベント内で - `<BUttonRelease-1>` と `<Motion>` を登録 - `<ButtonRelease-1>` でイベントハンドラを解除 - `<Motion>`内にマウスカーソル移動中の処理 - Step3: アイコンを枠の4隅に配置 - Step4: アイコンを移動時に他の2点の座標も移動させる(長方形の枠を維持) - Step5: アイコンの移動に応じて枠の描画を更新 (Canvas.coords) - Step6: キャンバスをドラッグ時に、枠を移動する - Step7: 枠の座標から、画像の切り取る範囲を決定

動作イメージ

イメージ説明


[2020/03/19 22:47] 追記: 参考ソース

「tkinter crop」 や 「トリミング」で検索して
良い感じに参考になりそうなコード見つかったので紹介します。
https://github.com/Lexing/pyImageCropper/blob/master/crop.py

  • ImageTkを用いてCanvasへ画像を描画
  • Image.cropを用いた切り取り
  • マウスでのドラッグ&ドロップの一連のイベント処理
  • 選択領域のリサイズ

あたりの参考になると思います。
UIの操作は違いますが、目的のものに近いのではないでしょうか。
マウスで範囲選択した後に、キーボードの十字キーで微調整できるようです。

操作は、コマンド引数でJPEG画像が置かれたディレクトリのパスを渡し起動、
スペースで切り取り保存し次のファイルへ、q で終了。

8年程前のコードなので、Python2系の環境が必要になりますが
1箇所だけ修正して動きました。win10 ActivePython2.7 + PIL で動作確認。
import ImageTk -> from PIL import ImageTk

画像の種類によっては get_exif_image() でエラーが出るかもしれないので、
その場合は追加でもう一箇所修正

python

1# get_image_exif()メソッド内に(適切なインデントで)追加 2if not hasattr(image, "_getexif"): 3 return

投稿2020/03/19 04:18

編集2020/03/19 13:49
teamikl

総合スコア8664

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

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

nto

2020/03/19 05:27

先日に引き続き、非常にわかりやすい手引きありがとうございます! かなり実装の為のイメージが湧き上がりました。 仕事の合間に制作をしておりましたので、少し時間を掛け試作をしていこうと思います。 改めて、また何か不明点が生じた際にはご質問させていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問