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 = 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

        # GPS Exif を潰す(Exif 2.3 で 31 まで使っているけど念のため広めのレンジを指定)
        if( $id -le 99 ){
            $Item.Len = 0
            $Item.Value = $null
            $bmp.SetPropertyItem($Item)
        }
    }

    # ファイル出力
    $bmp.Save($TempFile, [System.Drawing.Imaging.ImageFormat]::Jpeg )
    $bmp.Dispose()

    # オリジナルとテンポラリファイルを入れ替える
    del $JpegFileFullName
    ren $TempFile $JpegFileFullName
}

 

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
}

 

 

back.gif (1980 バイト)

home.gif (1907 バイト)

Copyright © MURA All rights reserved.