ホームページ >バックエンド開発 >Python チュートリアル >Python の Pillow ライブラリを使用して画像上の複数行のテキストをラップしてレンダリングする
Python 画像処理: Pillow ライブラリは自動行折り返しテキスト注釈を実装します
Python は、豊富なオープンソース ライブラリにより、画像処理の分野で主要なプログラミング言語となっています。 Pillow は、一般的に使用される画像処理ライブラリの 1 つで、シンプルで使いやすく、画像のスケーリング、トリミング、明るさの調整、注釈などの操作によく使用されます。
しかし、Pillow にはテキスト注釈に関する問題があります。テキストがテキスト ボックスの幅を超えると、自動的に折り返されません。 Pillow ライブラリ自体はこの機能を提供していないため、ロジックの実装を自分で記述する必要があります。
このチュートリアルでは、Pillow ライブラリを使用して Python でワードラップ テキスト ボックスを追加し、正しい画像テキストの注釈を付ける方法を説明します。最終的な効果は次のとおりです:
上の写真は私の Dev.to プロフィールのスクリーンショットです。これを例として使用して説明します。緑色のテキスト ボックスは、追加したテキスト注釈です。
このチュートリアルでは、条件文 (if、else)、for ループなどの基本的な Python プログラミングの知識が必要です。次のツールとソフトウェアも必要です:
次の手順に従って新しいプロジェクトを作成します:
A. ターミナル/コマンドラインを使用して新しいフォルダーを作成します:
<code class="language-bash">mkdir image_annotation</code>
B. pip を使用して virtualenv をインストールします (すでにインストールしている場合は、この手順をスキップしてください):
<code class="language-bash">pip install virtualenv</code>
C. 作業ディレクトリを image_annotation フォルダーに切り替えます:
<code class="language-bash">cd image_annotation</code>
D. 新しい仮想環境を作成します:
<code class="language-bash">virtualenv env</code>
E. 仮想環境をアクティブ化します (Windows のコマンド プロンプトを使用します):
Windows:
<code class="language-bash">.\env\Scripts\activate</code>
Linux/macOS:
<code class="language-bash">source env/bin/activate</code>
F. pip を使用して Pillow ライブラリをインストールします:
<code class="language-bash">pip install pillow</code>
コード エディターでプロジェクトを開き、プロジェクト フォルダーに script.py
という名前の新しい Python ファイルを作成します。
注釈を付けたい画像はベース画像です。 Pillow の ImageDraw
モジュールを使用して画像を開いて準備します。 script.py
ファイルに次のコードを記述します:
<code class="language-python">from PIL import Image, ImageDraw, ImageFont image_file = "path_to_image" # 请替换为您的图片路径 # 打开图像 image = Image.open(image_file) # 初始化ImageDraw draw = ImageDraw.Draw(image)</code>
枕では、プレーン テキストと背景を塗りつぶしたテキスト ボックスを追加できます。テキストは 1 行または複数行にすることができます。このチュートリアルでは、複数行のテキスト ボックスを追加する方法に焦点を当てます。
ImageDraw.multiline_text()
メソッドは複数行のプレーン テキストを追加できますが、背景のパディングは追加できません。 ImageDraw.rectangle()
メソッドでは、背景を塗りつぶしたテキスト ボックスを追加できます。
次のコードを script.py
ファイルに追加します:
<code class="language-bash">mkdir image_annotation</code>
このコードは、テキスト、フォント、およびテキスト ボックスの幅を設定します。 x
と y
変数は描画の開始点を表し、end_x
と end_y
はテキスト ボックスの右下隅の座標を表します。テキスト ボックスの幅と高さはそれぞれ 200 と 50 です。
ImageDraw.rectangle()
メソッドと ImageDraw.multiline_text()
メソッドは、それぞれテキスト ボックスと複数行テキストを描画するために使用されます。 image.show()
メソッドは、処理された画像を表示するために使用されます。 image.save("new_image.png")
を使用して画像を保存できます。結果は次のとおりです:
上の図の注釈にはまだ問題があり、複数行のテキストは自動的に折り返されません。次のセクションでは、この問題を解決する方法について説明します。
改行文字n
は改行位置を指定するために使用します。前の例では、改行文字 n
の後のコンテンツが折り返されます。しかし、実際のアプリケーションでは、通常、テキストの長さは動的であり、改行文字の位置を決定するのは困難です。
Pillow の ImageDraw
モジュールの .textlength()
属性は、テキストの長さを計算し、テキスト ボックスの幅と比較して改行位置を決定できます。
script.py
ファイルの先頭 (インポート ステートメントの後) に、ワードラップ ロジックを含む wrap_text()
という名前の新しい関数を作成します。
<code class="language-bash">pip install virtualenv</code>
、text
、font
変数の後に次のコードを追加します。 max_width
<code class="language-bash">cd image_annotation</code>
メソッドを次のコードに置き換えます: draw.multiline_text()
<code class="language-bash">virtualenv env</code>テキスト
から改行を削除し、コード n
を実行します。
<code class="language-bash">.\env\Scripts\activate</code>実行結果は、テキストがまだテキスト ボックスの高さを超えていることを示しています。テキストはテキスト ボックスの幅に自動的に調整されますが、テキスト ボックスの高さは固定されているため、テキストがオーバーフローします。
動的テキスト ボックスの高さを設定する
変数を動的な値 end_y
に変更することです。
<code class="language-bash">source env/bin/activate</code>この式は多くの実験を経てたどり着いたもので、このユースケースで動的なテキストボックスの高さを取得するための最良の解決策であると思われます。
リストにはテキスト ボックスに追加されるすべての行が含まれるため、リストの長さはテキスト ボックスの合計行数と同じになります。 wrapped_lines
ユースケースに最適なソリューションを得るには、行の合計数にさまざまな値を乗算する必要がある場合があります。
テキストパディングを追加
ファイルに新しい script.py
変数を追加し、テキスト ボックスのサイズを変更します: padding
<code class="language-bash">pip install pillow</code>このコードでは、テキストとテキスト ボックスの端の間にスペースを入れることができます。
ポインタは、注釈/ラベルが参照する画像の部分を便利に示すことができます。ポインタはラベルの前にある必要があります。これは、ポインターがテキスト ボックスの現在位置に描画され、テキスト ボックスが右に移動することを意味します。
したがって、テキスト ボックスの x 軸は新しい box_x
変数に関連付けられます。この変更は、テキストボックスの X 軸を使用して他の変数にも反映する必要があります。更新されたコードは次のとおりです:
<code class="language-bash">mkdir image_annotation</code>
上記のコードでは、ImageDraw.circle()
メソッド (10 は半径) を使用して、指定された点にポインターを描画します。 box_x
変数は、テキスト ボックスの X 軸の新しい値です。
以下は、script.py
ファイルの完全なコードです:
<code class="language-bash">pip install virtualenv</code>
画像処理は、思っているほど難しいものではありません。一部の画像処理ライブラリはモジュールの問題を直接解決できませんが、既存のモジュールを使用してユースケースに合わせた特定のソリューションを実装できます。それがコーディングの利点です。カスタムで特定のソリューションを使用して問題を解決できることです。
このチュートリアルでは、Python の Pillow ライブラリを使用して画像に注釈を付けたり、ワードラップされた複数行のテキスト ボックスを追加したりする方法を学びました。また、画像処理に役立つ数式の書き方も学びました。
使用されるモジュールの詳細については、Pillow のドキュメントを参照してください。
以上がPython の Pillow ライブラリを使用して画像上の複数行のテキストをラップしてレンダリングするの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。