exiftoolでexifを消す
写真からメタデータ(exif)をexiftoolで消す。
目次
- 1.インストール
- 2.exift削除
- 3.GitHub Workflowsでexift削除
1. インストール
brewでインストールできる。windowsは知らない。
% brew install exiftool
exiftool ファイル名.png
でexifを確認できる
% exiftool ファイル名.png
ExifTool Version Number : 12.76
File Name : essentialism.png
Directory : .
File Size : 7.4 MB
...省略...
2. exift削除
exiftool -all= ファイル名
でexifを削除でき、勝手にファイル名末尾に_original
を付けた加工前ファイルをバックアップしてくれる。バックアップが不要な場合は-overwrite_original
オプションをつければバックアップを取らずに上書きしてくれる。
% man exiftool
exiftool -all= dst.jpg
Delete all meta information from an image. Note: You should NOT do this to RAW images (except
DNG) since proprietary RAW image formats often contain information in the makernotes that is
necessary for converting the image.
...省略...
Processing control
-a (-duplicates) Allow duplicate tags to be extracted
-overwrite_original Overwrite original by renaming tmp file
バックアップ無しでexif削除
% exiftool -all= -overwrite_original ファイル名.png
ついでに、ディレクトリ指定で全配下画像のexifを削除できる。
% exiftool -all= -overwrite_original ディレクトリ名
1階層までしかスキャンしてくれないため、再帰的にやらせるなら-r
を指定する。
% exiftool -all= -overwrite_original -r ディレクトリ名
3.GitHub Workflowsでexift削除
pushされたら画像のexifを削除する pushするとs3へアップロードされcloud frontへ登録するActionsが動いているため、exif削除Actionsをpushで起動させこのActionsがs3へアップロードするActionsを呼び出すように修正する。
3.1 exif削除 Actions
main branchへのpushをトリガーとしてexifを削除し、再度pushするworkflowを作成。push起動でpushすると無限ループする?気がしたが、個人アクセストークンを使用しない限り後続のworkflowが動作しないようになってるらしい。
sshの鍵や払い出したトークンを渡す必要は無く、ビルトイントークンを使用してpushできるらしい。ただしこのレポジトリで動作させるWorkFlowに変更権限を付与するのと、Actions自体にもWrite権限を付与する必要がある。
レポジトリ側の設定はSettings
→Actions
→General
→Workflow permissions
でRead and write permissions
を選択すれば良い。Actionsはcontents: write
を記載する。

完成したexifを削除するActions。
name: delete-image-metadata
# main branchへのpushをトリガーとしてアップロード
# https://docs.github.com/ja/actions/using-workflows/workflow-syntax-for-github-actions#onpushbranchestagsbranches-ignoretags-ignore
on:
push:
branches:
- main
jobs:
delete-image-metadata:
runs-on: ubuntu-latest
permissions:
# action checkoutのためcontentsのread権限を付与
# repositoryへpushするためcontentsのwrite権限を付与
contents: write # This is required for actions/checkout and push
# workflowのタイムアウトは決め打ちで10分
# https://docs.github.com/ja/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idtimeout-minutes
timeout-minutes: 10
steps:
# レポジトリ チェックアウト
- name: Check out the repository
uses: actions/checkout@v4
# exiftoolをインストール
- name: install exiftool
run: |
sudo apt install exiftool
# exifを削除
- name: delete exif
run: |
exiftool -all= -overwrite_original -r content/posts
# 変更をpush
- name: push repo
run: |
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
git add .
git commit -m "delete exif"
git push
3.2 s3 Upload Actions起動条件変更
s3 へアップロードするActionsの起動条件を前段Actionsdelete-image-metadata
が完了した後動作し、かつ、前段Actionsが成功した場合のみJobを起動させるように修正する。
name: build-site-and-upload-s3
# exif削除workflow終了をトリガーに起動させる
# https://docs.github.com/ja/actions/writing-workflows/choosing-when-your-workflow-runs/events-that-trigger-workflows#workflow_run
on:
workflow_run:
workflows: [delete-image-metadata]
types:
- completed
jobs:
build-site-and-upload-s3:
runs-on: ubuntu-latest
# 前段のexifを削除するActionsが成功したときのみs3へアップロードする
# https://docs.github.com/ja/actions/writing-workflows/choosing-when-your-workflow-runs/events-that-trigger-workflows#running-a-workflow-based-on-the-conclusion-of-another-workflow
if: ${{ github.event.workflow_run.conclusion == 'success' }}
4. つまずいたとこ
Actionsからpushの権限が無い
pushが失敗して403が返ってきてしまった。
remote: Write access to repository not granted.
fatal: unable to access 'https://github.com/UserName/Repoasitory/': The requested URL returned error: 403
Error: Process completed with exit code 128.
Settings
→Actions
→General
→Workflow permissions
でRead and write permissions
を選べば書き込み権限もゲットできてpushできるようになる。もちらんActions側にもwrite権限を渡しておく必要がある。
前段のActionsが失敗しても後段のActionsが動作する
前段Actionsが失敗したら後段Actionsを起動させないことを目的に後段の起動条件をcompleted
にしていた。前段Actionsが失敗してもcompleted
になるらしくフツーに後段Actionsが動作してしまった。
on:
workflow_run:
workflows: [delete-image-metadata]
types:
- completed
よく読んだらちゃんと書いてあった。もちろん対策も書いてあって、前段Actionsがsuccess
であれば起動するようにJob起動条件に記載すればいいらしい。
ワークフロー実行は、前のワークフローの結果に関係なくトリガーされます。