Home >
Windows にまつわる e.t.c.
Jpeg ファイルの GPS Exif を PowerShell で削除する
写真をインターネット上に公開する場合、GPS 情報を削除したい事があります。
Exif を編集するツーはいろいろあるのですが、GPS 情報だけを削除する PowerShell 関数を書いてみました。
#######################################################
# Jpeg の GPS 位置情報を削除する
#######################################################
function RemoveGPSExif( $JpegFile ){
# 拡張子チェック
$FileName = Split-Path $JpegFile -Leaf
if( (($FileName -split "\.")[1] -ne "jpg" ) -and (($FileName -split "\.")[1] -ne "jpeg" )){
return
}
# フルパスにする
$JpegFileFullName = Convert-Path $JpegFile -ErrorAction SilentlyContinue
if( $JpegFileFullName -eq $null ){
echo "$JpegFile not convert full path."
return
}
# 存在確認
if( -not ( Test-Path $JpegFileFullName )){
echo "$JpegFile not found"
return
}
# テンポラリファイル名
$TempFile = $JpegFileFullName + ".tmp"
# アセンブリロード
Add-Type -AssemblyName System.Drawing
# Jpeg 読み込み
$bmp = [System.Drawing.Bitmap]::new($JpegFileFullName)
# GPS Exif を潰す(Exif 2.3 で 0 - 31 まで使っている)
for( $Index = 0; $Index -le 31; $Index++){
try{
[void]$bmp.GetPropertyItem($Index)
}
catch{
continue
}
$bmp.RemovePropertyItem($Index)
}
# ファイル出力
$bmp.Save($TempFile, [System.Drawing.Imaging.ImageFormat]::Jpeg )
$bmp.Dispose()
# オリジナルとテンポラリファイルを入れ替える
del $JpegFileFullName
ren $TempFile $JpegFileFullName
}
|
特定フォルダーに入っている *.jpg の GPS Exif を全部削除するのならこんな感じ。
PS C:\> dir
D:\Photo\*.jpg | % {
RemoveGPSExif
$_.FullName } |
F6 Exif で
GPS Exif の削除前と、削除後を比べてみましょう。
削除前
削除後
GPS 情報だけがきれいさっぱり消えていますね。
おまけ
Exif の画像方向が正位置以外の場合、html に組み込むとあらぬ方向で表示されることがあります。
先に作った関数の応用編で、画像方向(0x0112 / 10進:274)に正位置(1)をセットし、ペイント等の画像加工ソフトで物理回転させると思った方向に表示させることができます。
#######################################################
# Jpeg 画像方向を正位置にする
#######################################################
function SetNormalPositionExif( $JpegFile ){
# 拡張子チェック
$FileName = Split-Path $JpegFile -Leaf
if( (($FileName -split "\.")[1] -ne "jpg" ) -and (($FileName -split "\.")[1] -ne "jpeg" )){
return
}
# フルパスにする
$JpegFileFullName = Convert-Path $JpegFile -ErrorAction SilentlyContinue
if( $JpegFileFullName -eq $null ){
echo "$JpegFile not convert full path."
return
}
# 存在確認
if( -not ( Test-Path $JpegFileFullName )){
echo "$JpegFile not found"
return
}
# テンポラリファイル名
$TempFile = $JpegFileFullName + ".tmp"
# アセンブリロード
Add-Type -AssemblyName System.Drawing
# Jpeg 読み込み
$bmp = New-Object System.Drawing.Bitmap($JpegFileFullName)
# Exif を処理
$Index = $bmp.PropertyItems.Length
for ( $i = 0; $i -lt $Index; $i++ ){
$Item = $bmp.PropertyItems[$i]
$ID = $Item.Id
# 回線方向を正位置にする
if( $id -eq 274 ){
$Item.Value[0] = 1
$bmp.SetPropertyItem($Item)
}
}
# ファイル出力
$bmp.Save($TempFile, [System.Drawing.Imaging.ImageFormat]::Jpeg )
$bmp.Dispose()
# オリジナルとテンポラリファイルを入れ替える
del $JpegFileFullName
ren $TempFile $JpegFileFullName
}
|
リポジトリ
スクリプトは GitHub で公開しているので、必要でしたら Clone してください
Jpeg の GPS 位置情報を削除する
https://github.com/MuraAtVwnet/Remove-GPS-Exif
git@github.com:MuraAtVwnet/Remove-GPS-Exif.git
Jpeg 画像方向を正位置にする
https://github.com/MuraAtVwnet/Set-Normal-Position-Exif
git@github.com:MuraAtVwnet/Set-Normal-Position-Exif.git
参考情報
PowerShell で写真の撮影時間を変更する
http://www.vwnet.jp/windows/PowerShell/2021092501/ChangeShootingTime.htm
Copyright © MURA
All rights reserved.