Gitで整理!画像を200KB圧縮+コピーライト追加【第1回:リポジトリ構造】

当ページのリンクには広告が含まれています。

最近読んだ『Gitハンズオンラーニング』という書籍をきっかけに、Gitの便利さを実感しました。
「バージョン管理?」とこれまで全く気にしていなかったのですが、本の例題を試しながら読み進めると、作業の見える化・整理ができ、将来的な流用性の向上が期待できることがとても魅力的に感じました。

そこで今回、これまでブログ用に使っていたPythonスクリプト(主にガーデニング記録用の画像加工処理)をGit管理に移行してみることにしました。

ブログ用画像の加工には、次のような処理があります。

  • 横幅を1200pxにリサイズ Exifなどのメタ情報を削除
  • 200KB以下に圧縮
  • 必要に応じてラベル(テキスト)を追加

これらの作業をPythonで自動化してきました。今回はこのスクリプト群をGitで整理し、より管理しやすい開発環境へと移行していく過程を数回にわたって記録していこうと思います。

第1回となる今回は、Gitでどのようにリポジトリ構造を設計したかについて紹介します

目次

Gitとは?

Gitは、ファイルの変更履歴を記録・管理できるツールです。
ソースコードやドキュメントの編集履歴を保存できるため、過去の状態に戻したり、複数人での共同作業も簡単に行えます。

さらに、GitHubのようなオンラインサービスと組み合わせることで、クラウド上にバックアップの管理や、別のPCでの環境再現も可能になります。

私自身、「バージョン管理」という言葉は以前から知っていたものの、正直「個人の作業なら不要では?」と思っていました。
しかし、実際に使ってみると、その考えは大きく変わりました。

Gitを使うことで、以下のようなメリットが得られます:

過去の変更履歴を見返せる。

「あのときのコードに戻したい」と思ったとき、簡単に過去の状態に戻せます。

• 実験的な修正も怖くない

ブランチ という分岐機能を使うことで、本体に影響を与えずに試行錯誤ができます。
うまくいったらメインに統合、うまくいかなければ捨てるという柔軟な作業が可能です。

作業の区切りが明確になる

コミット は作業の「確定ボタン」です。
内容ごとにメッセージを残せるので、「何を」「なぜ」変更したのかが後から見返せます。

これまで私は、「oldフォルダ」に古いコードを入れたり、コメントを追記することでバージョン管理のようなことをしていました。しかし、Gitを使えばより確実で安心な管理ができると感じます。

ブログや趣味の範囲でも、Gitを導入することで作業の見える化や効率アップにつながると感じ、Git管理にチャレンジしてみることにしました。

リポジトリとは?

itにおけるリポジトリ(repository)とは、プロジェクトのファイルやその変更履歴をまとめて管理する「作業の保管庫」のようなものです。リポジトリは、MacのFinderやWindowsのエクスプローラー上のフォルダと同じようにファイルをまとめて保存する入れ物ですが、それに「変更履歴の管理機能」が加わったものと考えるとイメージしやすいです。

このリポジトリの中には、

  • Pythonのスクリプトや画像ファイルなどの実データ
  • ファイルの変更履歴(いつ、どこが、どのように変わったか)
  • ブランチやコミットといった作業の区切り
  • 他の人と共有するための情報

といった内容が含まれています。

Gitを使う際は、まず最初にこの「リポジトリ」を作成し、作業内容をすべてその中で管理していくのが基本的な流れです。

今回のような個人のプロジェクトであっても、リポジトリという“作業の保管庫”を用意しておくことで、進捗の記録や再利用がしやすくなり、結果としてより快適な開発環境が整っていきます。

リポジトリの構成とは?

今回のプロジェクトでは、「ブログ用の画像を効率よく加工する」ためのスクリプトと設定ファイル類をGitで管理します。

最初に迷ったのが、リポジトリを構成をどうするかです。複数のスクリプトを一か所にまとめるだけでも動作には支障ありませんが、目的ごとにファイルを整理しておくことで、後々の保守や再利用が格段にしやすくなると感じました。

リポジトリ構成

今回は次のリポジトリ構成としました。

image-compressor-with-text/
├── 01_legacy/             # すべての処理をまとめた初期バージョンの.pyファイルを保存
├── 90_test/               # テストコードや一時出力画像など検証用ファイル
├── input_images/          # 加工前の画像を格納するフォルダ
├── output_images/         # 加工後(リサイズ+圧縮)の画像を出力するフォルダ
├── sample/                # 一時的なサンプルファイルや実験素材など
├── utils/                 # 共通処理(リサイズ、圧縮など)を関数化したモジュール群
├── main.py                # エントリポイントとなるメインスクリプト
├── requirements.txt       # 必要なライブラリの一覧(pipで環境構築に使用)
└── README.md              # このプロジェクトの概要・使い方を記述したドキュメント

各フォルダの役割詳細

01_legacy

作成初期の .py ファイルを保存しています。
機能をすべて1ファイルにまとめた「とりあえず動く版」のスクリプト群です。整理前の実装履歴として保管しています。

09_test

テストコードとその動作確認用の画像を保存します。pytest による自動テストを実行する際のスクリプト類や、確認用の出力ファイルが含まれます。

input_mages

加工対象となる元画像を格納するフォルダです。主に JPEG 形式の画像を配置し、ここから一括処理を行います。

output_mages

リサイズ+圧縮された画像を出力します。ここに保存された画像が、ブログへのアップロード候補となります。

sample

sample/サンプル画像や、一時的な確認用ファイルを置くためのスペースです。処理対象としては使用しませんが、記録用や説明用に活用できます。

utils

リサイズや圧縮など、共通処理を関数としてまとめた Python モジュール群です。main.py やテストコードから呼び出されます。

なぜ番号付き?

フォルダ名の先頭に番号(例:”01”や”90”)を付けることで、エクスプローラーやVSCode上でも意図した順番で並べることができ、構造の視認性が向上します。複数プロジェクトが混在している場合でも、構造の読み取りやすさが大きく向上します。

作成するプログラム概要

プログラムの目的

JPEG画像を以下の処理で一括加工し、ブログ用に最適化された画像を作成する:
• 横幅を1200pxにリサイズ
• 目標サイズ(250KB)以下に圧縮
• ファイル名から日付を取得し、コピーライト付きテキストを画像に追加

プログラムの動作(処理の流れ)

STEP
指定フォルダ内の .jpeg 画像をすべて取得
STEP
各画像について以下を実行
  • ファイル名を取得して、保存用の出力パスを作成
  • 横幅を1200pxにリサイズし、一時保存
  • 250KB以下になるように品質を調整して圧縮保存
  • 「日付+©ふくゆー」のテキストを画像右下に追加(黒背景+白文字)
STEP
加工済み画像を「compress_元のファイル名.jpg」の形式でoutput_imagesフォルダに保存

このプログラムのutils構成と役割

今回作成した画像加工プログラムでは、処理の見通しをよくするために関数ごとに役割を分け、utilsフォルダにモジュールとして整理しました。

各処理を以下のようにモジュール化しています。

compress.py:リサイズ&圧縮を担当

JPEG画像のリサイズや目標サイズへの圧縮を行うモジュールです。

✅ 関数
• compress_and_resize_jpeg(input_path, output_path, quality, width)
 → 横幅を1200pxにリサイズし、Exif情報を削除した状態で一時保存します。
• compress_image_to_target_size(input_path, output_path, target_size_kb)
 → 画像が目標サイズ(例:250KB)を下回るよう、品質を調整して再保存します。

add_text.py:コピーライトの追加を担当

画像右下に「日付+©ふくゆー」といったテキストを半透明の黒背景+白文字で追加する処理を担います。

✅ 関数
• add_text_with_background(input_path, output_path, text, font_path, font_size)
 → テキストのサイズや位置を自動計算し、加工済み画像にテキストを描画して保存します。

処理をこのように分割することで次のようなメリットがあります。
• 各関数の役割が明確になる
• 不具合が出てもどのモジュールを見ればよいかがすぐにわかる
• 今後機能追加や変更があっても拡張しやすくなる

このように、ちょっとしたPythonスクリプトでも処理を整理しておくことで、流用性の向上し、長く使えそうと感じます。

main.py における処理の流れ

main.py は、画像の取得から最終出力までを統括する役割を担っています。

処理の流れは次の通りです。プログラムの動作(処理の流れ)で記載したステップの詳細を書いていきます。このステップでプログラムを組んでいく予定です。

STEP
指定フォルダ内の .jpeg 画像をすべて取得

glob モジュールで指定ディレクトリから全画像のパスをリスト形式で取得します。

STEP
各画像について以下を実行
  • ファイル名を取得して、保存用の出力パスを作成
    (例:compress_元ファイル名.jpg)
  • 画像を1200pxの横幅にリサイズし、一時保存
    (utils/compress.py の compress_and_resize_jpeg( ) を使用)
  • 250KB以下になるように品質を調整して再保存
    (compress_image_to_target_size( ) を使用)
  • 画像右下に「日付+©ふくゆー」のコピーライトを追加
    (utils/add_text.py の add_text_with_background( ) を使用)
STEP
加工済み画像を「compress_元のファイル名.jpg」の形式でoutput_imagesフォルダに保存

まとめ

今回、初めてGitでコード管理にチャレンジしています。
第一弾として、当ブログ用の写真加工に頻繁に使っている画像加工スクリプトをGit管理に移行してみます。処理を関数ごとに分けて utils フォルダに整理すると、どの部分で何をしているのかが明確になり、スクリプト全体の見通しもぐっと良くなった思います。

まずは、「とりあえず動くものを作る」。それから、Git管理に移行することで安全性や流用性を高めていく。そんなステップが良さそうです。

最初から完璧を目指さず、作ってから整る進め方でも、Gitを使えば安心して書き直せるし、変更の記録も残せます。今後はこの土台の上に、汎用性のある関数を少しずつ増やしながら、自分なりの便利な開発環境を育てていこうと思います。

※今回の記事では、作成した関数の具体的な中身には触れていません。第2弾で詳しく解説する予定ですので、そちらで順を追って紹介していきます。また、本記事にも後日、概要を追記する予定です。

目次