経緯
業務にて、PPM形式の画像ファイルを要求されることがあった。
PPMに変換してくれるWebサービスの一つにConvertioといったサービスが存在するが、今回は大量にPPM形式の画像ファイルが必要であったため、自身で簡単なプログラムを作ることにした。
必要な環境
- python3.x
- opencv-python (上記pythonと互換性のあるバージョン)
ppm形式とは
**PNM(Portable Any Map)**形式の画像フォーマットの一つであり、PPMはカラー画像を示す。JPEGやPNGは、画像を圧縮したフォーマットであるため、ファイルサイズが小さいが、PNMは圧縮されていないため、ファイルサイズは大きくなる。その代わりに圧縮されていないバイナリデータがそのまま記述されているため、データの読み書きがしやすいというメリットを持つ。
詳しくはこちらが参考になった。
ソースコード
# 必要なライブラリのインポート
import os
import sys
import glob
import shutil
import cv2
# 引数指定された変換対象のディレクトリの中身を全てリストで取得する
db_path = glob.glob(os.path.join(sys.argv[1] + "/*"))
# 変換対象一覧を表示
print("変換対象:{}".format([os.path.basename(name) for name in db_path]))
# 変換結果の格納先ディレクトリを作成
result_path = "./result/"
if(os.path.isdir(result_path) == True):
shutil.rmtree(result_path) # ./result/ が既に存在する場合は削除
os.makedirs(result_path, exist_ok=True)
cnt = 1
# 変換対象を1枚ずつ変換していく
for filename in db_path:
# 画像を読み込み
img = cv2.imread(filename)
# ファイル名(拡張子無し)を抽出
name = os.path.splitext(os.path.basename(filename))[0]
# 出力名を作成
resultname = result_path + name + ".ppm"
# 画像を書き出し
cv2.imwrite('{}'.format(resultname), img)
print("変換結果({}件目):{}".format(cnt,resultname))
cnt += 1
print("変換完了")
※出力名を作成の部分の拡張子を変更してあげれば、ある程度どんな拡張子でも変換出来るかと思います。
実行方法
$ python3 img2ppm.py <変換対象ディレクトリ>
変換対象:['00000.jpeg', '00001.jpeg', '00002.jpeg']
変換結果(1件目):./result/00000.ppm
変換結果(2件目):./result/00001.ppm
変換結果(3件目):./result/00002.ppm
変換完了
ソースコード公開先
後程リンク貼ります。
以上!