見出し画像

ゆるプロ!番外編「noteの記事見出し画像サイズに切り出すプログラムを書く

ゆるいプログラミング講座、略して「ゆるプロ!」これは気軽に気楽に試せるゆるーいプログラミング学習コンテンツである。今回のお題は「noteの記事見出し画像サイズに切り出すプログラムを書く」

一言)

noteの記事見出し画像をご存じだろうか、サイズは1280 × 670 pxである。この記事の見出し画像は1280×670で作成しているので、あまり気にすることはないのだが、携帯電話の写真を貼るときは全景は貼れないのではないだろうか。そもそも、なぜ、記事の見出し画像をこのサイズにしたのか理由が分からないので、どなたか知っている人がいたら教えてほしい。いずれにしても一般的ではないアスペクト比のサイズに合わせて楽に画像を切り出したいので本記事を書いた

要件

まず、画像のトリミングをエディタで毎回するのはメンドイ、手間が掛かるのでしたくない。プログラムでコマンドベースでトリミングできた方が早いと思うので、PythonとOpenCVを使って作成する。引数に画像パスを使用する。トリミングを開始するサイズは、1280×720(HD、16:9)とする。私の使用しているスマホは同じアスペクト比の3200×1800(QHD+、16:9)で撮影(0.6倍の広角撮影)をすることが出来るので、noteで記事の写真をアップするときにはそのモードで撮影しようと思う

さて、おおまかなフローとしては下記の通りの作業をコンピュータがしたらいいのではないかと思うので書き起こす

フロー

要はQHD+を2.5で割れば、HDの画像サイズになり、高さを50削れば、noteの記事の見出し画像と同じになる寸法だ。なお、このフローはプログラムのことを一旦忘れてこんなことをしたいというフローであり、実際のプログラムは必ずこの通りのフローになるとは限らないが、イメージとして共有しておく。要は目的の画像サイズが出来上がればいい。上下の描かれている内容が少し削れるがそこは諦める。変に幅や高さが縮むよりはマシだろうという判断である

例)noteの記事見出し画像サイズに切り出すプログラムを書く

import sys
import cv2
import os

# 引数にファイルパスを指定したか確認する
if len(sys.argv) < 2:
    print("ファイルパスが指定されていません。")
    sys.exit(1)

#ファイルパスの取得
#引数の画像のファイルパスを取得するためインデックス1を指定する、0はプログラムのファイルパス
#絶対パスとして取得する
filepath = os.path.abspath(sys.argv[1]) 

#ファイルが存在するか確認する
if not os.path.exists(filepath):
    print(f"指定されたファイル '{filepath}' が存在しません。")
    sys.exit(1)

#画像の読み込み
img = cv2.imread(filepath)

#画像を縮小する、shape[1]がwidth, shape[0]がheight
img2 = cv2.resize(img , (int(img.shape[1]/2.5), int(img.shape[0]/2.5)))

#画像をトリミングする
img3 = img2[25:695, 0:128]

#トリミングした画像の書き出し
cv2.imwrite(os.path.join(os.path.dirname(filepath),"trimming.jpg"), img3)

結果)

実行するときは下記のように打つ。カレントディレクトリのパスでも読み込む

>ppython .\trimming.py .\sample.jpg

元の画像

ピッタリおさまりきらない

トリミングした画像

ピッタリおさまった

参考)

OpenCV-Python Tutorials

Image Processing in OpenCV(OpenCVでの画像処理)

Google翻訳で使うのがオススメ

Geometric Transformations of Images(画像の幾何学的変換)

関数の部分をクリックすると詳細が出る

imreadの例

C++(?)とPythonの表記が書かれている

参考にしたブログ

OpenCVのトリミングで検索

OpenCVの縮小で検索

Pythonの引数で検索

引数として指定したファイルパスと同一のディレクトリに書き出したいので、"ファイルパス ディレクトリ 取得 python"のように検索

そういえば、jpgで保存するとき画像って品質あったんじゃなかったっけ?ということでデフォルトの吐き出す品質を調べた

あと、いつものようにChatGPT3.5にも教えてもらいました。ファイルパスの取り扱いの指摘を受けたため

おわり!

この記事が参加している募集

AIとやってみた