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

 

back.gif (1980 バイト)

home.gif (1907 バイト)

Copyright © MURA All rights reserved.