Billedramme med roterende fis i kasketten

Så er sommerferien vel vel-overstået og hvad er så mere irriterende end at dine sommerferiebilleder i jpeg-format vender forkert på din billedramme ift. hvordan der ser ud på dit kamera eller i Windows?

Det er da lige til at få en op i det røde felt efter en god afslappende sommerferie!

Jeg syntes i hvert fald at det er SMADDER irriterende og skyldes at (billige?) billedrammer ikke kan finde ud af at rotere billeder ud fra den EXIF attributterne, mens moderne Windows snilt kan (det er det der sker når du højreklikker på en jpeg-fil og beder windows rotere den med eller mod uret). I bund og grund sikkert fordi de ikke lige har CPU nok til at rotere billedet on-the-fly.

Det mest hammer irriterende er at man først opdager det når man har kopieret billedet til billedrammen – og lige spotter det – og hvad er det så lige det billede hedder, der vender forkert?

 

Derfor fra alle mig til alle jer en lille sommerhilsen der ellers ikke har noget at gøre med denne blogs normale indhold, en powershell løsning på problemet:
Følgende script indeholder funktioner der aflæser EXIF attributten og derefter rent faktisk roterer billedet på PCen hvis det er nødvendigt (så skal din biledramme ikke bekymre sig om det når den nu alligevel ikke vil).
…og så en funktion der lige gennemsøger alle billeder i et katalog – inkl. underkataloger – og behandler dem. Dvs. du kan blot sætte scriptet til at behandle alle billederne på dit SD-kort (eller hvor du nu har din billedrammes billeder). I eksemplet nederst hedder SD-kortet D:

# 20170526 GSL - SystemConnect. Source: http://blog.systemconnect.dk
#
[System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")

function Get-EXIFRotationAttribute($FilePath) {
# Returns:
# 1 = "Horizontal"
# 3 = "Rotate 180 degrees"
# 6 = "Rotate 90 degrees clockwise"
# 8 = "Rotate 270 degrees clockwise"
  $WiaImage = New-Object -ComObject Wia.ImageFile
  $WiaImage.LoadFile($FilePath)
  if($WiaImage.Properties.Exists("274")) {
    return ($WiaImage.Properties.Item("274").Value)
  }
  return -1
}

function RotateClockwise-JpegImage($Degrees,$FilePath) {
  $Image = [System.Drawing.image]::FromFile( $FilePath )
  switch($Degrees) {
    90  { $Image.rotateflip("Rotate90FlipNone") }
    180 { $Image.rotateflip("Rotate180FlipNone") }
    270 { $Image.rotateflip("Rotate270FlipNone") }
  }
  $Image.save($FilePath)
  Write-Host -ForegroundColor Yellow "File $FilePath rotated $Degrees degrees clockwise"
}

function Rotate-JpegImages($ImagePath) {
  write-host "Checking for jpg/jpeg images that needs rotation in path $ImagePath (including subdirectories)..."
  $JpegFiles = get-childitem -Recurse -Path "$ImagePath\*" -File -Include @("*.jpg","*.jpeg")
  ForEach($JpegFile IN $JpegFiles) {
    $FilePath = Join-Path -Path $ImagePath -ChildPath $JpegFile.Name
    $EXIFRotationAttribute = Get-EXIFRotationAttribute $FilePath
    switch($EXIFRotationAttribute) {
    6 { RotateClockwise-JpegImage 90 $FilePath }
    3 { RotateClockwise-JpegImage 180 $FilePath }
    8 { RotateClockwise-JpegImage 270 $FilePath }
    }
  }
}

# Rotate all images on D: (including subdirectories)

Rotate-JpegImages "D:"
Dermed skulle problemet være løst en gang for alle. God fornøjelse 🙂