[Python] Pillow ライブラリを使ってみる

1 枕の紹介

1.1 PILと枕

PIL (Python Imaging Library) は、Python 用のサードパーティ画像処理ライブラリであり、豊富な機能とシンプルで使いやすい API が高く評価されています。

2011 年以降、PIL ライブラリの更新が遅いため、現在は Python 2.7 バージョンのみをサポートしていますが、明らかに Python3 バージョンのニーズを満たすことができません。そこで、Python コミュニティのボランティア グループ (主な貢献者: Alex Clark と Contributors) が、PIL ライブラリに基づいて Python3 バージョンをサポートする画像処理ライブラリ (Pillow) を開発しました。

Pillow は PIL ライブラリの「コピー」であるだけでなく、PIL ライブラリに基づいた多くの新機能も追加しています。 Pillow は今日まで発展し、PIL よりも動的な画像処理ライブラリになりました。

Pillow の当初の目的は、PIL ライブラリのブランチおよび補足であるだけでしたが、現在では「青よりも優れた」ものになっています。

PIL および Pillow ライブラリに加えて、Python は他の画像処理ライブラリも提供します。

  • Scikit-image: scipy 科学計算に基づく画像処理ソフトウェア パッケージで、画像を配列の形式で処理します。
  • OpenCV: 実際には C++ 画像処理ライブラリですが、Python 言語インターフェイスを提供します。

Pillow は Python の比較的基本的な画像処理ライブラリであり、主に画像のトリミング、画像のサイズ変更、画像の色処理などの基本的な画像処理に使用されます。 OpenCVやScikit-imageはPillowに比べて機能が豊富なため操作が複雑ですが、主にマシンビジョンや有名な「顔認識」アプリケーションなどの画像解析などの分野で使用されています。

Pillow ライブラリ (PIL ライブラリとも呼ばれることもあります) は、Python 画像処理用の基本ライブラリです。無料でオープン ソースの 3 つ目です。 -party library 、Pillow は非常に強力な画像処理機能を提供し、いくつかの画像処理タスクを簡単に完了できます。 Python の他の画像処理ライブラリ (OpenCV、Scikit-image など) と比較して、Pillow ライブラリはシンプルで使いやすいため、初心者が学習するのに非常に適しています。

Pillow ライブラリは、主に次のような非常に豊富な関数セットを提供します。

  • Pillow ライブラリは、さまざまな形式で画像を簡単に読み取り、保存できます。
  • Pillow ライブラリは、多くの画像処理タスクを簡単に完了できるシンプルで使いやすい API インターフェイスを提供します。
  • Pillow ライブラリは、GUI (グラフィカル ユーザー インターフェイス) パッケージ Tkinter で使用できます。
  • Pillow ライブラリ内の画像オブジェクトは、NumPy ndarray 配列との間で変換できます。

豊富な機能の実現には、Pillow が提供する多数のモジュールの恩恵を受けます。 Pillow ライブラリには、Image 画像処理モジュール、ImageFont テキスト追加モジュール、ImageColor カラー処理モジュール、ImageDraw 描画モジュールなど、20 を超えるモジュールがあります。各モジュールは異なる機能を実装しており、同時にモジュール間で相互作用することができます。お互いに協力しましょう。 (Python Pillow 公式ドキュメントを参照してください:Pillow (PIL Fork) 10.1.0.dev0 ドキュメント)

 1.2 ピローバージョンのサポート

 Pillow は、Windows、Linux、MacOS などのクロスプラットフォーム操作をサポートしています。その最新バージョンは Pillow 8.3.2 で、Python 3.6 以降 (推奨) をサポートしています。 Pillow と Python のサポートされているバージョンの比較表は次のとおりです。

Pythonのバージョン 3.10 3.9 3.8 3.7 3.6 3.5 2.7
枕>=8.3.2 サポート サポート サポート サポート サポート
枕8.0-8.3.1 サポート サポート サポート サポート
枕7.0-7.2 サポート サポート サポート サポート
枕6.2.1-6.22 サポート サポート サポート サポート サポート
枕6..0-6.2.0 サポート サポート サポート サポート

1.3 枕ライブラリの機能

Pillowライブラリは画像処理によく使われるライブラリとして、主に以下の3つの特徴を持っています。

1) 幅広いファイル形式をサポート

Pillow は、「jpeg」、「png」、「bmp」、「gif」、「ppm」、「tiff」など、幅広い画像形式をサポートしています。同時に画像フォーマット間の相互変換もサポートします。つまり、Pillow はほぼすべての画像形式を処理できます。​ 

2)豊富な機能を提供

Pillow は豊富な画像処理機能を提供します。これは 2 つの側面に要約できます。

  • 画像アーカイブ
  • 画像処理

画像のアーカイブには、サムネイルの作成、プレビュー画像の生成、画像のバッチ処理などが含まれ、画像処理には、画像のサイズ変更、画像のトリミング、ピクセル処理、フィルターの追加、画像の色処理などが含まれます。

3) GUIツールとの併用

Pillow ライブラリは、Python GUI (グラフィカル ユーザー インターフェイス) ツール Tkinter で使用できます。

上記の機能に加えて、Pillow ライブラリは、画像への透かしの追加、GIF ダイナミック レンダリングの合成など、より複雑な画像処理操作を実装することもできます。


2 ピローのダウンロードとインストール

ピローのインストールは非常に簡単で便利です。Python パッケージ マネージャー pip を使用してインストールできます。この方法はどのプラットフォームにも適しています。コマンド ライン ウィンドウに次のコマンドを入力して実行するだけです。

pip install pillow

: PIL ライブラリと Pillow ライブラリは同じ環境に共存できません。以前に PIL ライブラリをインストールしたことがある場合は、アンインストールしてから Pillow をインストールしてください。

 最後に、CMD コマンド ラインで Python インタープリター対話環境を開き、次のコードを入力して、Pillow が正常にインストールされているかどうかを確認します。

# 导入Image类,该类是pillow中用于图像处理的重要类
from PIL import Image

以下に示すように、インタープリタがエラーを返さなければ、インストールが成功したことがわかります。

 : ここではインポートに PIL を使用していますが、実際には Pillow ライブラリが使用されます。ここでの PIL は Pillow library の略称と考えることができます。


3 枕画像オブジェクト 

3.1 画像オブジェクトの作成

Image クラスは、Pillow ライブラリで最も重要なクラスです。このクラスは、同じ名前の Image モジュールで定義されています。

次のパッケージ インポート方法を使用して、イメージ モジュールを導入します。

from PIL import Image

3.2 画像オブジェクトのインスタンス化

Image クラスを使用して Image オブジェクトをインスタンス化し、オブジェクトの一連のプロパティとメソッドを呼び出して画像を処理できます。 Pilow には、Image インスタンス オブジェクトを作成するための 2 つのメソッドが用意されており、以下に簡単に紹介します。

1)オープン() 

 Image クラスの open() メソッドを使用すると、Image オブジェクトを作成できます。構文形式は次のとおりです。

image = Image.open(fp,mode="r")

パラメータの説明:

  • fp: filepath の略語で、ファイル パスと文字列形式を示します。
  • mode: オプションのパラメータ。このパラメータが表示される場合は、「r」に設定する必要があります。それ以外の場合は、ValueError 例外が発生します。

例は次のとおりです。 

# 导包
from PIL import Image
# 打开一个图片文件
image = Image.open("C:/Users/Lee/Desktop/美女01.jpg")
# 调用 show()方法,显示图像
image.show()

画像表示結果は以下の通りです。

2)新しい()

 Image クラスが提供する new() メソッドを使用して、新しい Image オブジェクトを作成できます。構文形式は次のとおりです。

image = Image.new(mode, size, color)

 パラメータの説明は次のとおりです。

  • モード: 画像モード、RGB (トゥルー カラー イメージ)、L (グレースケール イメージ)、CMYK (カラー マップ印刷モード) などの文字列パラメータ。
  • size: 画像サイズ、タプルパラメータ (幅、高さ) は画像のピクセルサイズを表します。
  • color: 画像の色、デフォルト値は 0 (黒を意味します) パラメータ値は、(R、G、B) 3 つの数値形式、色の 16 進値、および色の英単語をサポートします。

例は次のとおりです。

image = Image.new(mode='RGB', size=(300, 200), color="green")
image.show()

 出力イメージは次のようになります。

 

 3.3 画像オブジェクトのプロパティ

 Image オブジェクトには、一般的に使用される基本属性がいくつかあります。これらの属性は、画像の基本情報を理解するのに役立ちます。これらの属性について簡単に説明します:

1) サイズ: 画像のサイズを表示します。
from PIL import Image

image = Image.open("D:/users/Desktop/美女01.jpg")
# 打印image对象
print(image)
# 通过size查看
print("图像的大小size:", image.size)
# 或者直接查看宽、高
print("宽是%s高是%s" % (image.width, image.height))

出力結果: 

<PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=192x120 at 0x26B75C87310>
图像的大小size: (192, 120)
宽是192高是120
 2) フォーマット: 画像のフォーマットを表示します。
from PIL import Image

image = Image.open("D:/users/Desktop/美女01.jpg")
print("图像的格式:", image.format)

出力結果:

图像的格式: JPEG
3) readonly: 画像が読み取り専用かどうか
from PIL import Image

image = Image.open("D:/users/Desktop/美女01.jpg")
print("图像是否为只读:", image.readonly)

 この属性の戻り値は 0 または 1 で、それぞれ Yes と No に対応し、出力結果は次のようになります。

图像是否为只读: 1
 4) info: 画像関連情報を表示します。
from PIL import Image

image = Image.open("D:/users/Desktop/美女01.jpg")
# 包括了每英寸像素点大小和截图软件信息
print("图像信息:", image.info)

この属性の戻り値は辞書形式であり、出力結果は次のようになります。

 画像情報: {'jfif': 257、'jfif_version': (1, 1)、'dpi': (96, 96)、'jfif_unit& #39;: 1, 'jfif_density': (96, 96)}

 5) モード: 画像モード
from PIL import Image

image = Image.open("D:/users/Desktop/美女01.jpg")
print("图像模式信息:", image.mode)

 出力結果:

图像模式信息: RGB

 上記には、RGB、RGBA などの多くの画像モードの名前が含まれています。次の表に、一般的に使用される画像モードの簡単な概要を示します。

ピクチャーモード
モード 説明する
1 1 ビット ピクセル (値範囲 0 ~ 1)、0 は黒を表し、1 は白、モノクロ チャネルを表します。
L 8 ビット ピクセル (値の範囲 0 ~ 255)、グレースケール イメージ、モノクロ チャネル。
P 8 ビット ピクセル、他のモード、モノクロ チャネルへのパレット マッピングを使用。
RGB 3 x 8 ビット ピクセル、トゥルー カラー、3 つのカラー チャネル、各チャネルの値の範囲は 0 ~ 255 です。
RGBA 4 x 8 ビット ピクセル、トゥルー カラー + 透明度チャネル、4 つのカラー チャネル。
CMYK 4 x 8 ビット ピクセル、4 つのカラー チャネル、写真の印刷に適しています。
YCbCr 3 x 8 ビット ピクセル、カラー ビデオ フォーマット、3 つのカラー チャネル。
ラボ 3 x 8 ビット ピクセル、L*a*b カラー スペース、3 つのカラー チャネル
HSV 3 x 8 ビット ピクセル、色相、彩度、値色空間、3 つのカラー チャネル。
32 ビット符号付き整数ピクセル、モノクロ チャネル。
F 32 ビット浮動小数点ピクセル、モノクロ チャネル。

4 枕画像フォーマット変換

 Pillow ライブラリは複数の画像形式をサポートしています。画像の種類を考慮せずに、open() メソッドを直接使用して画像を読み取ることができます。同時に、Pillow は画像形式間で簡単に変換できます。

画像形式間の変換には主に 2 つの方法があり、以下に紹介します。

 4.1 save()

 save() メソッドは名前のとおり、画像を保存するために使用されます。ファイル形式が指定されていない場合はデフォルトの画像形式で保存され、画像形式が指定されている場合は指定された形式で保存されます。 。 save() の構文形式は次のとおりです。

Image.save(fp, format=None)

 パラメータの説明は次のとおりです。

  • fp: 画像の名前と文字列形式を含む画像のストレージ パス。
  • format: オプションのパラメータで、画像の形式を指定できます。

例は次のとおりです。

from PIL import Image

image = Image.open("D:/users/Desktop/美女01.jpg")
image.save('D:/users/Desktop/美女02.bmp')
image.save('D:/users/Desktop/美女03.png')

 この時点で、コンピューターによって指定されたパスの場所「D:/users/Desktop/」には、さらに 2 つの画像が存在します。「Beauty 02.bmp」形式の画像と「Beauty 03」形式の画像です。 .png」。

4.2 convert()+save()

注意! save() メソッドを使用してすべての画像形式を変換できるわけではありません。たとえば、PNG 形式の画像を JPG 形式に保存する場合、save() メソッドを直接使用すると、次のようになります。エラーが発生します: a>

from PIL import Image

image = Image.open("D:/users/Desktop/城市01.png")
image.save('D:/users/Desktop/城市02.jpg')

エラーメッセージは次のとおりです。

# 系统错误,RGBA不能作为JPEG图片的模式
OSError: cannot write mode RGBA as JPEG

によって発生するエラーは、PNG と JPG 画像モードの間の不一致によって発生します。このうち、PNG は赤、緑、青、アルファの透明色の 4 チャンネルの RGBA モードで、JPG は 3 チャンネルの RGB モードです。したがって、画像フォーマットを変換するには、PNG を 3 チャネル RGB モードに変換する必要があります。

Image クラスが提供するconvert()メソッドは、イメージモードの変換を実現します。この関数は、モード、マトリックス、ディザなどの複数のパラメータを提供します。最も重要なパラメータはモードであり、他のパラメータを考慮する必要はありません。構文形式は次のとおりです。

convert(mode,parms**)

パラメータの説明は次のとおりです。

  • モード: 変換先の画像モードを指します。
  • params: その他のオプションのパラメータ。

変更されたコードは次のようになります。

from PIL import Image

image = Image.open("D:/users/Desktop/城市01.png")
# 此时返回一个新的image_1对象,转换图片模式
image_1 = image.convert('RGB')
# 调用save()保存
image_1.save('D:/users/Desktop/城市02.jpg')

上記のコードにより、PNG 形式の画像を JPG 形式に正常に変換できます。


5 枕画像の拡大縮小操作

5.1 フリースケーリング

画像処理の過程では、画像を縮小したり拡大したりする場面がよくありますが、Imageクラスが提供するresize()メソッドを使用することで、画像を任意に縮小・拡大することができます。

resize() 関数の構文形式は次のとおりです:

resize(size, resample=image.BICUBIC, box=None, reducing_gap=None)

パラメータの説明:

  • サイズ: タプルパラメータ (幅、高さ)、スケーリング後の画像のサイズ。
  • resample: オプションのパラメータ。画像リサンプリング フィルタを指します。thumbnail() の resample パラメータと同様、デフォルトは Image.BICUBIC です。
  • box: 指定された画像領域を拡大縮小します。box のパラメータ値は、長さ 4 (左、上、右、下) のピクセル座標タプルです。なお、指定範囲は元画像の範囲内である必要があり、範囲を超える場合はエラーとなります。このパラメータが渡されない場合、デフォルトでは元の画像全体が拡大縮小されます。
  • ducing_gap: オプションのパラメータ、浮動小数点パラメータ値、画像のズーム効果を最適化するために使用されます。一般的なパラメータ値は 3.0 と 5.0 です。

注:size() は新しい画像オブジェクトを返します。画像をズームインする一連の例を次に示します。

from PIL import Image

image = Image.open("D:/users/Desktop/美女03.png")
try:
    # 放大图片
    image_1 = image.resize((576, 360))
    # 将新图像保存至桌面
    image_1.save("D:/users/Desktop/美女03放大图像.png")
    print("新图像的尺寸是:", image_1.size)
except IOError:
    print("放大图像失败!")

出力結果:

新图像的尺寸是:(576, 360)

画像を拡大する効果です。次のように:

 画像の一部を拡大します。例は次のとおりです。

from PIL import Image

image = Image.open("D:/users/Desktop/美女03.png")
try:
    # 选择放大的局部位置,并选择图片重采样方式
    # box四元组指的是像素坐标 (左,上,右,下)
    # (0,0,120,180),表示以原图的左上角为原点,选择宽和高分别是(192,120)的图像区域
    image_1 = image.resize((576, 360), resample=Image.LANCZOS, box=(0, 0, 96, 60))
    image_1.show()
    # 将局部放大的新图像保存至桌面
    image_1.save("D:/users/Desktop/美女03局部放大图像.png")
    print("新图像的尺寸是:", image_1.size)
except IOError:
    print("放大图像失败!")

出力結果:

新图像的尺寸是: (576, 360)

画像拡大効果は以下の通りです。

 5.2 サムネイルの作成

サムネイル画像とは、元の画像を指定したサイズ(サイズ)に縮小した画像のことを指します。サムネイルを作成すると、画像の表示と閲覧が容易になります。 Image オブジェクトは、画像のサムネイルを生成するための thumbnail() メソッドを提供します。

thumbnail() 関数の構文形式は次のとおりです:

thumbnail(size,resample)

パラメータの説明は次のとおりです。 

  • size: タプルパラメータ。縮小された画像サイズを参照します。
  • resample: オプションのパラメーター。画像リサンプリング フィルターを参照します。フィルター方法には、Image.BICUBIC (バイキュービック補間方法)、PIL.Image.NEAREST (最近傍補間方法)、PIL.Image.BILINEAR (バイキュービック補間方法) の 4 つがあります。 .線形補間方式)、PIL.Image.LANCZOS(ダウンサンプリングフィルタ補間方式)、デフォルトはImage.BICUBICです。

使用例は以下のとおりです。

from PIL import Image

image = Image.open("D:/users/Desktop/美女03.png")
image.thumbnail((96, 60))
print("缩略图尺寸:", image.size)
# 将缩略图保存至桌面
image.save("D:/users/Desktop/美女03缩略图.png")

出力結果: 

缩略图尺寸: (96, 60)

注: サムネイルのサイズは、指定したサイズと一致しない場合があります。これは、Pillow が元の画像の長さと幅を同じ比率で縮小するためです。指定したサイズが画像のサイズ仕様を満たしていない場合、元画像のサイズ指定を超えるなど、サムネイルの作成に失敗します。

5.3 画像サイズを一括変更する

画像処理プロセスでは、詳細な処理を必要としない一部のリンクについては、形式の一括変換、サイズの一括変更、透かしの一括追加、サムネイルの一括作成などのバッチ処理手法がよく使用されます。これは作業効率を向上させる効果的な方法であり、単一の繰り返し操作を回避します。画像のサイズは、Pillow が提供する Image.resize() メソッドを使用してバッチで変更できます。以下の簡単な例を見てみましょう。

まず、同じ種類でサイズが異なる画像をいくつか見つけて、デスクトップの OldImage フォルダに置きます。以下に示すように:

コードを書き始めましょう:

from PIL import Image
import os

# 指定 存放批量处理后的图片目录,如果目录不存在,则创建目录
if not os.path.exists('D:/users/Desktop/NewImage/'):
    os.mkdir('D:/users/Desktop/NewImage/')
# 设定统一的目标尺寸
width = 320
height = 320
# 读取待处理图片的目录
fileName = os.listdir('D:/users/Desktop/OldImage/')
print(fileName)
# 循环读取每一张图片
for img in fileName:
    old_image = Image.open('D:/users/Desktop/OldImage/' + img)
    new_image = old_image.resize((width, height), Image.BILINEAR)
    print(new_image)
    # 保存新图片到指定目录
    new_image.save('D:/users/Desktop/NewImage/' + img)

出力は次のとおりです。

['98.jpg', 'hao.jpg', '古典美女.jpg', '小龙女.jpg', '旅行01.jpg', '画像.jpg']
<PIL.Image.Image image mode=RGB size=320x320 at 0x156D8807FD0>
<PIL.Image.Image image mode=RGB size=320x320 at 0x156D8807280>
<PIL.Image.Image image mode=RGB size=320x320 at 0x156D8807FA0>
<PIL.Image.Image image mode=RGB size=320x320 at 0x156D8807F40>
<PIL.Image.Image image mode=RGB size=320x320 at 0x156D8807F70>
<PIL.Image.Image image mode=RGB size=320x320 at 0x156D8807280>

NewImage ディレクトリの内容は次のとおりです。

 フォルダー内の画像が均一の幅と高さに拡大縮小されていることがわかります。


6 枕画像の分離と結合

画像 (デジタル画像を指す) は多くのピクセルで構成されていることがわかっています。ピクセルは画像の基本単位であり、各ピクセルは異なる色を使用することができ、最終的にはカラフルな画像を表現できます。前のセクション「枕画像オブジェクトのプロパティ」では、いくつかの画像モードを紹介しました。その本質は、画像が RGB、RGBA、CYMK などの色を表現するときに従う必要があるルールです。画像の分離と結合は、画像の分離と結合を指します。画像の色の分離と結合。

Image クラスには、画像を分割および結合するためのメソッド、split() メソッドと merge() メソッドが用意されています。通常、これら 2 つのメソッドは一緒に使用されます。

6.1 スプリット()

split() は比較的簡単に使用でき、カラー チャネルを分離するために使用されます。これを使用して、次の美しい女性の写真を処理します。

 次のようにコードを記述します。

from PIL import Image

image = Image.open("D:/users/Desktop/美女3号.jpg")
# 修改图像大小,以适应图像处理
image_1 = image.resize((960, 600))
image_1.save("D:/users/Desktop/美女3号_1.jpg")
# 分离颜色通道,产生三个 Image对象
r, g, b = image_1.split()
r.show()
g.show()
b.show()

 出力結果は次のように順番に表示されます。

6.2 マージ() 

Image クラスによって提供される merge() メソッドは、画像の結合を実現できます。画像の結合は、単一の画像を結合することも、2 つ以上の画像を結合することもできることに注意してください。

merge() メソッドの構文形式は次のとおりです。

Image.merge(mode, bands)

パラメータの説明は次のとおりです。

  • mode: 出力画像のモードを指定します。
  • バンド: パラメータのタイプはタプルまたはリスト シーケンスで、その要素の値は画像を構成するカラー チャネルです。たとえば、RGB は 3 つのカラー チャネルを表し、(r, g, b) として表現できます。

注: この関数は新しい Image オブジェクトを返します。

2 種類の画像結合を以下に紹介します。

1) 単一画像の結合とは、異なる同じ画像効果を得るためにカラー チャネルを再結合することを指します。 、コードは次のとおりです。

from PIL import Image

image = Image.open("D:/users/Desktop/美女3号.jpg")
# 修改图像大小,以适应图像处理
image_1 = image.resize((960, 600))
image_1.save("D:/users/Desktop/美女3号_1.jpg")
# 分离颜色通道,产生三个 Image对象
r, g, b = image_1.split()
# 重新组合颜色通道,返回新的Image对象
image_merge = Image.merge('RGB', (g, b, r))
image_merge.show()
# 保存新图像至桌面
image_merge.save("D:/users/Desktop/美女3号_2.jpg")

新しく合成された画像は次のようになります。

 2) 2 つの画像の結合操作は複雑ではありませんが、2 つの画像のモードと画像サイズが一致していなければ、結合できません。したがって、異なるモードやサイズの画像には前処理が必要です。

次に、上記の美しさ番号 3 を別の美しさ番号 5 とマージします。美しさ番号 5 の元の画像は次のとおりです。

 次のようにコードを記述します。

from PIL import Image

# 打开图1和图2
image_1 = Image.open("D:/users/Desktop/美女3号.jpg")
image_2 = Image.open("D:/users/Desktop/美女5号.jpg")
# 因为两种图片的图片格式一致,所以仅需要处理图片的大小,让它们保持一致
# 让 image_2 的图像尺寸与 image_1 一致,注意此处新生成了 Image 对象
image_2n = image_2.resize(image_1.size)
# 接下来,对图像进行颜色分离操作
r1, g1, b1 = image_1.split()
r2, g2, b2 = image_2n.split()
# 合并图像
image_3 = Image.merge('RGB', [r2, g1, b2])
image_3.show()
image_3.save("D:/users/Desktop/合成美女35号.jpg")

画像合成結果:

 6.3 Blend() は画像をブレンドします

Image クラスは、RGBA モードの画像 (PNG 形式) をブレンドするための Blend() メソッドも提供します。関数の構文は次のとおりです。

Image.blend(image1,image2, alpha)

パラメータの説明は次のとおりです。

  • image1、image2: 2 つの Image オブジェクトを表します。
  • alpha: 透明度を表し、値の範囲は 0 ~ 1 です。値が 0 の場合、出力画像は image1 のコピーに相当し、値が 1 の場合、出力画像は image2 のコピーに相当します。値が 0.5 の場合のみ、出力イメージは image1 のコピーと等価です。 は 2 つのイメージを結合したものです。したがって、この値のサイズによって、2 つの画像がどのようにブレンドされるかが決まります。

RGB モードと比較して、RGBA は RGB に透明度を追加し、アルファ値によって 2 つのイメージのブレンドの程度を決定します。例は次のとおりです。

from PIL import Image

# 打开图片1
image_1 = Image.open("D:/users/Desktop/美女3号.png")
# 打开图片2
image_2 = Image.open("D:/users/Desktop/美女5号.png")
# 让图片2的尺寸和图片1保持一致
image_2n = image_2.resize(image_1.size)
# 设置 混合值alpha 为 0.5
Image.blend(image_1, image_2n, 0.6).save("D:/users/Desktop/混合美女53号.png")

出力は次のとおりです。


7 枕画像の切り抜き、コピー&ペーストの操作

画像のトリミング、コピー、貼り付けは、画像処理でよく使用される基本的な操作です。Pillow Image クラスは、これらの単純な画像処理操作を迅速に実装するのに役立つ、シンプルで使いやすい API インターフェイスを提供します。

7.1 画像の切り出し操作

Image クラスが提供する Crop() 関数を使用すると、元の画像を長方形の領域で切り取ることができます。関数の構文形式は次のとおりです。

crop(box=None)

パラメータの説明:

  • ボックス: トリミング領域を表します。デフォルトは [なし] で、元の画像をコピーすることを意味します。

注: box は 4 つの数値 (x_左上、y_左下、x1_右上、y1_右下) を含むタプル パラメーターであり、それぞれ切り取られた長方形領域の左上隅の x 座標と y 座標を表します。右下隅の x、y 座標。デフォルト (0,0) は座標原点を表し、幅方向が x 軸、高さ方向が y 軸で、各ピクセルが単位を表します。

Crop() 関数は Image オブジェクトを返します。使用例は次のとおりです。

from PIL import Image

image = Image.open("./image/美女3号.jpg")
box = (0, 0, 960, 600)
im_crop = image.crop(box)
im_crop.show()
im_crop.save("./image/美女3号裁剪.jpg")

出力イメージを以下に示します。

最後に、元の画像に基づいて、ピクセル サイズ 960 * 600 の画像がトリミングされます。

7.2 画像のコピー&ペースト

コピーと貼り付けの操作は、ほとんどペアで行われます。Image クラスには、画像をコピーして貼り付けるための copy() メソッドと Past() メソッドが用意されています。このうち、比較的簡単なコピー操作(copy()メソッド)については、主にpaste()ペーストメソッドを紹介します。構文形式は以下のとおりです。

paste(image, box=None, mask=None)

この関数の機能は、ある画像を別の画像に貼り付けることです。貼り付けた画像モードは自動的に一貫性を維持し、追加の変換は必要ないことに注意してください。

パラメータの説明は次のとおりです。

  • 画像: 貼り付けられる画像を指します。
  • box: 画像を貼り付ける位置または領域を指定します。パラメータ値は長さ 2 または 4 のタプル列です。長さが 2 の場合は、特定の点 (x, y) と貼り付けの開始座標を表します。長さは4です 画像を貼り付ける領域を示します このとき、領域のサイズは貼り付けた画像のサイズと一致している必要があり、そうでない場合はエラーが報告されます。
  • マスク: オプションのパラメータ。画像にマスク効果を追加します。

次に、元の画像のコピーをコピーし、コピーを切り取って貼り付けます。コードは次のとおりです。

from PIL import Image

image = Image.open("./image/美女3号.jpg")
# 复制一张图片副本
image_copy = image.copy()
# 对副本进行裁剪
im_crop = image_copy.crop((480, 300, 1440, 900))
# im_crop.show()
# 创建一个新的图像作为蒙版,L模式,大小为(960, 600),单颜色值
image_new = Image.new('L', (960, 600), 100)
# image_new.show()
# 将裁剪后的副本粘贴至副本图像上,并添加蒙版
image_copy.paste(im_crop, (200, 100, 1160, 700), mask=image_new)
# image_copy.paste(im_crop, (200, 100), mask=image_new)  这样写也可以,就不用考虑大小匹配问题,指定好左上角要放置的坐标点
# 显示粘贴后的图像
image_copy.show()
# 保存粘贴后的图像
image_copy.save("./image/美女3号裁剪粘贴.jpg")

 出力された表示結果は次のとおりです。

 

 


8 枕画像の幾何学的変形

画像の幾何学的変換には主に画像の反転、画像の回転、および画像の変換操作が含まれます。Image クラスにはこれらの操作を処理する関数 transpose()、rotate()、transform() が用意されています。これらについては以下で説明します。

8.1 transpose() 反転操作

この関数は画像の上下左右の反転を実現することができ、その構文形式は次のとおりです。

Image.transpose(method)

メソッドパラメータは画像を反転する方法を決定し、パラメータ値は次のとおりです。

  • Image.FLIP_LEFT_RIGHT: 左右を水平方向に反転します。
  • Image.FLIP_TOP_BOTTOM: 垂直に上下に反転します。
  • Image.ROTATE_90: 画像を 90 度回転します。
  • Image.ROTATE_180: 画像を 180 度回転します。
  • Image.ROTATE_270: 画像を 270 度回転します。
  • Image.TRANSPOSE: 画像を転置します。
  • Image.TRANSVERSE: 画像を水平方向に反転します。

使用例は以下のとおりです。

from PIL import Image

image = Image.open("./image/美女3号.jpg")
# 图像翻转后,返回一个新的Image对象
image_t = image.transpose(Image.FLIP_TOP_BOTTOM)
image_t.show()
image_t.save("./image/美女3号翻转.jpg")

画像は次のような結果を示しています。

 

8.2rotate() 任意の角度で回転する

画像を任意の角度に回転したい場合は、rotate() 関数を使用できます。構文は次のとおりです。

Image.rotate(angle, resample=PIL.Image.NEAREST, expand=None, center=None, translate=None, fillcolor=None)

パラメータの説明は次のとおりです。

  • angle: 任意の回転角度を表します。
  • resample: リサンプリング フィルター、デフォルトは PIL.Image.NEAREST 最近傍補間法です。
  • Expand: 画像を拡大するかどうかを示すオプションのパラメータです。パラメータ値が True の場合、出力画像は拡大されます。False または省略された場合は、元の画像サイズに従って出力されます。
  • center: 回転の中心を指定するオプションのパラメータです。パラメータ値は長さ 2 のタプルです。デフォルトでは、画像の中心が回転に使用されます。
  • translation: パラメーター値はタプルであり、左上隅を原点として回転された画像を平行移動することを意味します。
  • fillcolor: オプションのパラメータ、塗りつぶしの色。画像が回転された後、画像の外側の領域が塗りつぶされます。

使用例は以下のとおりです。

from PIL import Image

image = Image.open("./image/美女3号.jpg")
# translate的参数值可以为负数,fillcolor将旋转图之外的区域填充为绿色
# 旋转后返回同一个新的Image对象
image_r = image.rotate(30, translate=(-50, -30), fillcolor="yellow")
image_r.show()
image_r.save("./image/美女3号旋转.jpg")

出力結果:

 

8.3transform()画像変換

この関数は、画像を変換し、指定された変換方法により指定されたサイズの新しい画像を生成できます。構文形式は次のとおりです。

Image.transform(size, method, data=None, resample=0) 

パラメータの説明:

  • サイズ: 新しい画像のサイズを指定します。
  • メソッド: 画像がどのように変化するかを指定します。たとえば、Image.EXTENT は長方形の変換を表します。
  • data: このパラメータは、変換メソッドに必要なデータを提供するために使用されます。
  • resample: 画像リサンプリング フィルター。デフォルトのパラメーター値は PIL.Image.NEAREST です。

使用例は以下のとおりです。

from PIL import Image

image = Image.open("./image/美女3号.jpg")
# 设置图像大小500*500,并根据data的数据截取原图像的区域,生成新的图像
image_tf = image.transform((500, 500), Image.EXTENT, data=[image.width // 3, image.height // 2, 1200, 955])
image_tf.show()
image_tf.save("./image/美女3号变换.jpg")

出力イメージを以下に示します。


 

9 枕画像ノイズ低減処理

画像機器、伝送メディア、その他の要因の影響により、画像には多かれ少なかれ不要な干渉情報が常に存在します。これらの干渉情報を総称して「ノイズ」と呼びます。デジタル画像における「ノイズ」。「ソルト&ペッパー ノイズ」とは、画像内にランダムに現れるいくつかの白と黒のピクセルを指します。画像ノイズは画像の品質に影響を与えるだけでなく、人間の視覚的な鑑賞を妨げます。したがって、ノイズ処理は画像処理プロセスの重要なリンクの 1 つであり、画像ノイズを処理するプロセスを「画像ノイズ リダクション」と呼びます。

デジタル画像技術の継続的な発展に伴い、画像ノイズ低減方法はますます成熟しており、特定のアルゴリズムを使用してフィルタを構築することが画像ノイズ低減の主な方法となっています。このフィルターは、処理された画像の形状、サイズ、元のトポロジーに影響を与えることなく、ノイズの発生を効果的に抑制できます。

Pillow は、ImageFilter クラスを通じて画像ノイズ低減の目的を達成します。このクラスは、さまざまな種類のフィルタを統合します。これらを呼び出すことにより、画像の平滑化、鮮明化、境界強調、その他の画像ノイズ低減操作を実現できます。 . .一般的なノイズ低減フィルタを次の表に示します。

画像ノイズ低減フィルター
名前 説明する
ImageFilter.BLUR ファジーフィルタリング、つまり平均値フィルタリング
ImageFilter.CONTOUR 輪郭フィルタリング、画像の輪郭情報を検索
ImageFilter.DETAIL 詳細フィルタリングにより、画像がより詳細に表示されます
ImageFilter.FIND_EDGES 境界フィルタリング (画像の境界情報を見つける)
ImageFilter.EMBOSS レリーフフィルタリング、画像をレリーフ画像として表示
ImageFilter.EDGE_ENHANCE 境界強調フィルタリング
ImageFilter.EDGE_ENHANCE_MORE ディープエッジ強調フィルタリング
ImageFilter.SMOOTH スムージングフィルター
ImageFilter.SMOOTH_MORE ディープスムージングフィルター
ImageFilter.SHARPEN シャープニングフィルター
ImageFilter.GaussianBlur() ガウスぼかし
ImageFilter.UnsharpMask() アンシャープマスクフィルター
ImageFilter.Kernel() コンボリューションカーネルフィルタリング
ImageFilter.MinFilter(サイズ) size パラメーターで指定された領域から最小のピクセル値を選択し、それを出力イメージに格納する最小フィルター。
ImageFilter.MedianFilter(サイズ) メディアン フィルターは、サイズ パラメーターで指定された領域からピクセル値の中央値を選択し、それを出力イメージに保存します。
ImageFilter.MaxFilter(サイズ) 最大フィルター
ImageFilter.ModeFilter() パターンフィルタリング

デモンストレーションの例として、上の表からいくつかの方法を選択します。処理を待機している元の画像は次のとおりです。

 9.1 ぼかし

# 导入Image类和ImageFilter类
from PIL import Image, ImageFilter

image = Image.open("./image/风景.jpg")
# 图像模糊处理
image_blur = image.filter(ImageFilter.BLUR)
image_blur.show()
image_blur.save("./image/风景_模糊.jpg")

出力イメージは次のとおりです。

 9.2 等高線描画

from PIL import Image, ImageFilter

image = Image.open("./image/风景.jpg")
# 生成轮廓图
image_contour = image.filter(ImageFilter.CONTOUR)
image_contour.show()
image_contour.save("./image/风景_轮廓.jpg")

出力イメージは次のとおりです。

 9.3 エッジ検出

from PIL import Image, ImageFilter

image = Image.open("./image/风景.jpg")
# 边缘检测
image_edges = image.filter(ImageFilter.FIND_EDGES)
image_edges.show()
image_edges.save("./image/风景_边缘检测.jpg")

出力イメージは次のとおりです。

 

9.4 レリーフ画像

from PIL import Image, ImageFilter

image = Image.open("./image/风景.jpg")
# 浮雕图
image_contour = image.filter(ImageFilter.EMBOSS)
image_contour.show()
image_contour.save("./image/风景_浮雕图.jpg")

出力イメージは次のとおりです。

 

9.5 滑らかな画像

from PIL import Image, ImageFilter

image = Image.open("./image/风景.jpg")
# 平滑图像
image_contour = image.filter(ImageFilter.SMOOTH)
image_contour.show()
image_contour.save("./image/风景_平滑.jpg")

出力イメージは次のとおりです。 

 PhotoShop(略称:Ps、プロ仕様の画像処理ソフト)やFireworks(略称、Fw、プロ仕様の画像処理ソフト)や携帯電話の美容ソフトなどを使用したことがある方なら、上記の操作が「 「フィルター」はフィルターを追加することで写真の外観を変更し、それによって写真の感覚的な経験に影響を与えます。


 

10 枕画像の色処理

Pillow は、RGB 形式のカラー トリプル、16 進数の色名 (#ff0000)、カラー英単語 (「red」) など、さまざまな形式の色をサポートする色処理モジュール ImageColor を提供します。同時に、CSS (Web ページの装飾に使用される Cascading Style Sheets) スタイルの色を RGB 形式に変換することもできます。

注: ImageColor モジュールは色のサイズに影響されません。たとえば、「Red」は「red」と書くこともできます。

10.1 色の命名

ImageColor は、よく知られている RGB カラー モードなどの複数のカラー モード (つまり、外観を表すために固定形式を使用する) の命名をサポートしています。さらに、HSL (色相-彩度-明るさ)、HSB (別名: HSV、色相-彩度-明度) カラー モード。 HSL の簡単な紹介は次のとおりです。

  • H: 色相 値の範囲は 0 ~ 360 で、0 は「赤」、120 は「緑」、240 は「青」を表します。
  • S: 彩度。色の純度を表し、0 ~ 100% の範囲で表します。0 はグレーを表し、100% は最も飽和した色を表します。
  • L: 明度。値は 0 ~ 100% で、0 は「黒」を意味し、50% は通常の色を意味し、100% は白を意味します。

以下では、HSL カラー モードを使用して、次の形式で赤を表します。

HSL(0,100%,50%)

このときの色はRGB(255,0,0)に相当する「ピュアレッド」です。 HSL/HSB について詳しく知りたい場合は、リンクをクリックしてご覧ください。

ImageColor モジュールは比較的単純で、getrgb() 関数と getcolor() 関数という 2 つの一般的なメソッドのみを提供します。

10.2 getrgb() メソッド

名前が示すように、この関数は色の RGB 値を取得するために使用されます。構文形式は次のとおりです。

PIL.ImageColor.getrgb(color)

使用例は以下のとおりです。

from PIL import ImageColor

# getrgb()方法
color1 = ImageColor.getrgb("blue")
print(color1)
color2 = ImageColor.getrgb('#DCDCDC')
print(color2)
# 使用HSL模式红色
color3 = ImageColor.getrgb('HSL(0,100%,50%)')
print(color3)

出力は次のとおりです。

(0, 0, 255)
(220, 220, 220)
(255, 0, 0)

 new() メソッドを使用して新しい画像を作成できますが、この時点で、次に示すように ImageColor.getrgb() を使用することもできます。

from PIL import Image

# 使用new()绘制新的图像
image = Image.new("RGB", (200, 200), ImageColor.getrgb("#A214B4"))
image.save("./image/新建01.jpg")

表示画像は以下の通りです。

 

10.3 getcolor()

このメソッドは getrgb() に似ており、色の値を取得するためにも使用されますが、もう 1 つのパラメータがあるmodeので、この関数は指定された色の色の値を取得できます。モード。構文形式は次のとおりです。

PIL.ImageColor.getcolor(color, mode)

パラメータの説明は次のとおりです。

  • color: 文字列形式の色の名前。色の英語の単語または 16 進数の色名を指定できます。サポートされていない色の場合は、ValueError エラーが報告されます。
  • mode: カラーモードを指定します。サポートされていないモードの場合は、KeyError エラーが報告されます。

使用例は以下のとおりです。

color4 = ImageColor.getcolor('#A214B4', 'L')
print(color4)
color5 = ImageColor.getcolor('yellow', 'RGBA')
print(color5)

出力結果:

81
(255, 255, 0, 255)

11 枕は写真に透かしを追加します

画像にウォーターマークを追加すると、他人による画像の悪用をある程度防ぐことができます。これは画像の著作権を保護する効果的な方法です。したがって、Weibo やブログなどの公開プラットフォームで写真を共有する場合は、写真が自分のものであることを証明するために、写真に透かしを追加することをお勧めします。

ウォーターマークを追加するには、さまざまな方法があります。たとえば、画像処理ソフトウェアや携帯電話の美容ソフトウェアを使用してウォーターマークを追加できます。ただし、この操作はより複雑で、一部のソフトウェアは無料ではありません。

Pillow ライブラリは、操作、学習、使用が簡単なウォーターマークを追加する方法を提供します。 PIilow を使用して画像に透かしを追加する方法を学びましょう。

ウォーターマークは元の画像に添付されたテキスト情報であることがわかっているため、ウォーターマークを追加するプロセスには 2 つの問題が含まれます。

  • まず、写真に文字情報を付加する方法です。
  • 次に、テキスト情報の描画方法です。

これら 2 つの問題が解決されていれば、ウォーターマークを正常に追加できます。 Pillow が提供する ImageDraw モジュールと ImageFont モジュールは、上記の問題をうまく解決します。

11.1 イメージドロー

PIL.ImageDraw モジュールは一連の描画メソッドを提供します。このモジュールを通じて、新しいグラフィックを作成したり、既存の画像に別のグラフィックを描画したりして、元の画像に注釈を付けたり、変更したりできます。

以下では、ImageDraw オブジェクトを作成し、そのオブジェクトの使用方法を簡単に説明します。

draw = ImageDraw.Draw(image)

 上記のメソッドは ImageDraw オブジェクトを返し、パラメータ image は Image オブジェクトを表します。ここでは、Image オブジェクトをキャンバスとして理解することができ、ImageDraw オブジェクトのいくつかのメソッドを呼び出すことで、キャンバス上に新しいグラフィックを描画できます。 ImageDraw オブジェクトの一般的に使用されるメソッドを次の表に示します。

ImageDraw の一般的なメソッド
方法 説明する
文章 画像上にテキストを描画します
ライン 直線と線分を描く
日食 楕円を描く
矩形 長方形を描く
ポリゴン 多角形を描く

 注: 表の最初のメソッド text() は、ImageFont モジュールで使用する必要があります。これについては、以下で詳しく説明します。

 長方形グラフを描画するための構文形式は次のとおりです。

draw.rectangle(xy, fill=None, outline=None)

 パラメータの説明は次のとおりです。

  • xy: 画像の左上隅を座標の原点としたタプルのパラメータ値。((x1,y1,x2の形式で)長方形の画像の位置と画像のサイズの座標列を示します。 ,y2));
  • fill: 長方形の背景の塗りつぶし色。
  • アウトライン: 長方形グラフの境界線の色。

簡単な例を見てみましょう:

from PIL import Image, ImageDraw

# 创建 Image 对象,当做背景图
image = Image.new('RGB', (200, 200), color='gray')
# 创建 ImageDraw 对象
draw = ImageDraw.Draw(image)
# 以左上角为原点,绘制矩形。元组坐标序列表示矩形的位置、大小;fill设置填充色为红色,outline设置边框线为黑色
draw.rectangle((100, 50, 150, 100), fill=(255, 0, 0), outline=(0, 0, 0))
# 查看原图片
image.show()
# 保存图片
image.save("./image/添加矩形图.png")

グラフ表示結果は以下の通りです。

 

11.2 画像フォント

PIL.ImagreFont モジュールは、TrueType フォントや OpenType フォントなど、さまざまな形式のフォント ファイルをロードすることによって、画像上にさまざまなタイプのテキストを描画します。

フォント オブジェクトを作成するための構文形式は次のとおりです。

font = ImageFont.truetype(font='字体文件路径', size=字体大小)

画像にテキストを追加する場合は、ImageDraw.text() メソッドも使用する必要があります。構文は次のとおりです。

draw =  ImageDraw(image)
draw.text((x,y), "text", font, fill)

パラメータの説明は次のとおりです。

  • (x,y): 画像の左上隅が座標原点であり、(x,y) はテキストの追加の開始座標位置を表します。
  • text: 文字列形式、追加されるテキスト内容。
  • フォント: ImageFont オブジェクト;
  • fill: テキストの塗りつぶしの色。

以下に示すように、一連の使用例を見てみましょう。

from PIL import Image, ImageFont, ImageDraw

# 打开图片,返回 Image对象
image = Image.open("./image/风景.jpg")
# 创建画布对象
draw = ImageDraw.Draw(image)
# 加载计算机本地字体文件
font1 = ImageFont.truetype('C:/Windows/Fonts/msyh.ttc', size=36)
font2 = ImageFont.truetype('C:/Windows/Fonts/LHANDW.TTF', size=28)
# 在原图像上添加文本
draw.text(xy=(220, 150), text='o0o江山如此多娇o0o', fill=(255, 0, 0), font=font1)
draw.text(xy=(260, 250), text='China123', fill=(255, 100, 50), font=font2)
image.show()
image.save("./image/风景_水印.png")

画像表示結果は以下の通りです。

 

11.3 画像の透かしを追加する

上記の知識の学習を通じて、ImageDraw モジュールと ImageFont モジュールについて一般的に理解し、また、次の 2 つの問題も解決しました。写真に透かしを追加する、これが重要な質問です。次の例は、画像にウォーターマークを追加する詳細なプロセスを示しています。コードは次のとおりです。

from PIL import Image, ImageFont, ImageDraw

font = ImageFont.truetype('C:/Windows/Fonts/msyh.ttc', size=36)


def creating_watermark(image, text, font=font):
    # 后面给水印添加透明度,因此需要先转换图片的格式
    image_rgba = image.convert('RGBA')
    print(image_rgba.size)
    # 按照传入的image对象的尺寸,新建一个RGBA模式的白色图片
    im_text_canvas = Image.new('RGBA', image_rgba.size, (255, 255, 255, 0))
    print(im_text_canvas.size)
    # 用刚刚创建的RGBA图片创建画布对象,用于放着水印内容,即text内容
    draw = ImageDraw.Draw(im_text_canvas)

    # 获取文本框的宽度和高度
    # draw.textbbox 返回四元组,表示文本内容的左上角和右下角的两个坐标位置(x0, y0, x1, y1)
    bbox = draw.textbbox((0, 0), text, font=font)
    text_width = bbox[2] - bbox[0]
    text_height = bbox[3] - bbox[1]
    print(text_width, text_height)
    # 计算得到添加文本的起始坐标位置
    text_xy = (image_rgba.size[0] - text_width - 20, image_rgba.size[1] - text_height - 20)  # -20是微调动作,可以不减
    print(text_xy)
    # 在画布对象上添加文本,并设置文本颜色(白色)和透明度(半透明) fill参数的最后一位数值决定透明程度。
    draw.text(text_xy, text, font=font, fill=(255, 255, 255, 120))
    # 将原图片与文字画布复合
    image_text = Image.alpha_composite(image_rgba, im_text_canvas)
    return image_text


image = Image.open("image/风景.jpg")
# image.show()
image_water = creating_watermark(image, '@江山如此多娇')
image_water.show()
image_water.save("image/风景_Watermark.png")

透かしを追加した後のレンダリング:


 

12 Pillow 配列と ndarray 配列

NumPy は、Python 科学技術コンピューティングの基本データ パッケージであり、画像認識、自然言語処理、データ マイニングなどの機械学習の分野で広く使用されています。 NumPy は、事前にダウンロードしてインストールする必要があるサードパーティのライブラリです。

ndarray は NumPy の配列型であり、ndarray 配列とも呼ばれます。この配列は、Pillow の PIL.Image オブジェクトとの間で変換できます。

12.1 ndarray 配列から画像を作成する

次の例では、ndarray 配列を使用して Image オブジェクトを構築し、イメージを表示します。例は次のとおりです。

# 使用numpy之前需要提前安装
import numpy as np
# 导入相关的包
from PIL import Image

# 创建 300*400的图像,3个颜色通道
array = np.zeros([300, 400, 3], dtype=np.uint8)
# rgb色彩模式
array[:, :200] = [255, 255, 0]
array[:, 200:] = [0, 255, 0]
img = Image.fromarray(array)
img.show()
img.save("./image/数组生成图像.png")

出力は次のとおりです。

 

 12.2 画像を ndarray 配列に変換する

画像は ndarray 配列として出力されます。例は次のとおりです。

import numpy as np
from PIL import Image

img = Image.open("./image/风景.jpg")
img.show()
# Image图像转换为ndarray数组
img_2 = np.array(img)
print(img_2)
# ndarray数组转换为Image图像
arr_img = Image.fromarray(img_2)
# 显示图片
arr_img.show()
# 保存图片
arr_img.save("./image/风景_arr.jpg")

画像表示結果:

 画像を構成するピクセル配列は次のとおりです。

[[[135 178 213]
  [133 178 211]
  [131 177 210]
  ...
  [205 177 173]
  [206 178 174]
  [207 179 175]]

 [[136 174 210]
  [136 174 210]
  [134 174 209]
  ...
  [207 178 174]
  [208 179 175]
  [209 180 176]]

 [[139 175 211]
  [140 176 212]
  [140 176 212]
  ...
  [210 179 176]
  [211 180 175]
  [212 181 176]]

 ...

 [[ 72  97 119]
  [ 71  97 120]
  [ 63  93 117]
  ...
  [122 127 130]
  [ 73  77  80]
  [123 122 128]]

 [[ 59  87 108]
  [ 58  86 107]
  [ 54  85 106]
  ...
  [ 99 104 107]
  [ 85  88  93]
  [ 84  83  89]]

 [[ 56  87 107]
  [ 62  90 111]
  [ 64  92 114]
  ...
  [ 72  77  80]
  [ 52  55  60]
  [ 79  78  86]]]


13 Pillow は GIF アニメーションを生成します

GIF (Graphics Interchange Format、Graphics Interchange Format) は、画像の拡張子として .gif を使用する「ビットマップ」画像形式です。 GIF 画像は、画像の事前圧縮技術を使用しているため、インターネットでの使用に非常に適しており、この技術を適用することにより、画像の伝播と読み込みにかかる時間がある程度短縮されます。

他の形式の画像と比較して、GIF には動的な画像を生成するという非常に重要な用途があります。 Pillow は GIF 形式を含むさまざまな画像形式を処理でき、静的形式の画像 (png、jpg) を GIF アニメーションに合成できることがわかっています。 

注: Pillow は常に GIF ファイルをグレースケール モード (L) またはパレット モード (P) で読み取ります。

一連の例を見てみましょう: Pillow を使用して GiF ダイナミック グラフィックスを生成する方法。

元素材画像:

 完全なコードは次のとおりです。

import os
import random
from PIL import Image


def png_to_gif(png_path, gif_path):
    """png合成gif图像"""
    img_frames = []
    # 返回文件夹内的所有静态图的列表
    png_files = os.listdir(png_path)
    # 打印返回的列表
    print(png_files)
    # 读取文件内的静态图,并随机选取到列表中,也可以不随机,就按顺序取
    for i in range(0, len(png_files)):
        img = Image.open(os.path.join(png_path, random.choice(png_files)))  # 随机入列
        # img = Image.open(os.path.join(png_path, png_files[i]))   # 按原本的顺序入列
        img_frames.append(img)
    # 以第一张图片作为开始,将后续的所有图片合并成 gif 动态图
    img_frames[0].save(gif_path, save_all=True, append_images=img_frames[1:], transparency=0, duration=500, loop=0, disposal=2)
    # 参数说明:
    # save_all 保存图像;    transparency 设置透明背景色;   duration 单位毫秒,动画持续时间,
    # loop=0 无限循环;  disposal=2 恢复原背景颜色。参数详细说明,请参阅官方文档,网址见文章末尾处。


# 调用函数,传入对应的参数
png_path = "D:/PycharmProjects/Pillow练习/image/pngs"
gif_path = "D:/PycharmProjects/Pillow练习/image/悟空.gif"
png_to_gif(png_path, gif_path)

以下に示すような動的レンダリング:

 

Pillow の詳細については、公式ドキュメントを参照してください:クリックして移動


おすすめ

転載: blog.csdn.net/weixin_43498642/article/details/131934074