PeterExif.ps1



Function Get-ExifContents {
param(
    $ImageStream, 
    [int] $ExifCode
)

    Try {
        if (-not $ImageStream.PropertyIdList.Contains($ExifTagCode))
        {
            $Value = "<empty>"
        } else {
            $PropertyItem = $ImageStream.GetPropertyItem($ExifCode)
            $valueBytes = $PropertyItem.Value
            $Value = [System.Text.Encoding]::ASCII.GetString($valueBytes)
        }
    }
    Catch{
        $Value = "<empty>"     
    }

    return $Value
}
    
    
Function Get-ImageFileContents {
param(
    [String] $ImageFile
)

    Try {
        $fullPath = (Resolve-Path $ImageFile).Path
        $fs = [System.IO.File]::OpenRead($fullPath)
        $image = [System.Drawing.Image]::FromStream($fs, $false, $false)

        $maker = Get-ExifContents -ImageStream $image -ExifCode 271
        $model = Get-ExifContents -ImageStream $image -ExifCode 272
        $version = Get-ExifContents -ImageStream $image -ExifCode 305
        $dateTime = Get-ExifContents -ImageStream $image -ExifCode 306
        $latRef = Get-ExifContents -ImageStream $image -ExifCode 1
        $longRef = Get-ExifContents -ImageStream $image -ExifCode 3
    
        $ExifData = [PSCustomObject][ordered]@{
            File = $ImageFile
            CameraMaker = $maker
            CameraModel = $model
            SoftwareVersion = $version
            DateTaken = $dateTime
        }

        $image.dispose()
        $fs.Close()

        Write-Host " File '$($ExifData.File)' and maker '$($ExifData.CameraMaker)' "

        return $ExifData
    }
    Catch {
        Write-Error "Error Opening '$ImageFile'"
        if ($image) {
            $image.dispose()
        }
        if ($fs) {
            $fs.close()
        }
        return $null
    }
}