Kumollaan olevien valokuvien korjaus

Ongelman syy löydetty, ohjelmanpätkä kirjoitettu, kuvat korjattu ja teksti kirjoitettu 7.2.2023.

Palvelun catza.net joissakin valokuvissa oli tapahtunut muutos. Kuvat olivat kääntyneet pystyasennosta kyljelleen itsestään, vaikka julkaisuhetkellä ne olivat oikeassa asennossa. Mikään ei ollut muuttunut kuvatiedostoissa eikä palvelun ohjelmakoodisa. Syyn täytyi siis olla jossain muualla.

Vaikuttaa siltä että webbiselaimiin on joskus viimeisen kymmenen vuoden aikana lisätty ominaisuus, jota niissä ei alkujaan ollut. Selaimet eivät enää vain esitä kuvaa siinä asennossa kuin se sattuu olemaan, vaan katsovat ensin kuvatiedostoon sisältyvistä metatiedoista Orientation-tiedon. Jos sen mukaan kuva ei ole valmiiksi oikeassa asennossa, selain kääntää kuvan oikeaan asentoon.

Osassa palvelun catza.net vuoden 2008 kuvissa Orientation-metatieto oli jostain tuntemattomasta historian hämärään jäävästä syystä arvossa 8, joka sai kuvat kääntymään kyljelleen nykyaikaisissa selaimissa. Tällaisia kuvia oli yhteensä 2 533 kpl. Korjauksena asiaan oli kirjoittaa Perl-kielellä ohjelmanpätkä joka kävi korjaamassa näiden kuvatiedostojen Orientation-tiedon arvoon 1, joka kertoo selaimelle että kuva on jo oikeassa asennossa eikä sitä pidä kääntää.

Ohjelmanpätkän ohjelmakoodi on opiksi tässä alla. Ohjelma käy läpi hakemistopuun, etsii sieltä tiedostot joissa Orientation on arvossa 8, päivittää ne arvoon 1 ja kirjoittaa muutokset tiedostoihin.

#
# Copyright (c) 2023 Heikki Siltala
# Licensed under The MIT License
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
#

use 5.30.0;
use strict;
use warnings;

use Image::ExifTool;
use File::Find qw( finddepth );

my @files;

# set your root directory here
my $root_dir =
 '********************************';

my $fix   = 0;
my $nofix = 0;

finddepth(
 sub {
  ( $_ eq '.d' or  $_ eq '..' ) and return;
  -d $File::Find::name and return;
   push @files, $File::Find::name;
 }, $root_dir
);

my $exif = Image::ExifTool->new;

foreach my $file ( @files ) {

 my $status =
  $exif->ExtractInfo( $file );

 $status == 1 or
  die "unable to read exif data from file $file";

 my @tags =
  $exif->GetFoundTags( $file );

 my $orientation = -1;

 foreach my $tag ( @tags ) {

  $tag =~ /^Orientation$/ and do {

   $orientation =
    $exif->GetValue($tag, 'ValueConv');

  };

 }

 if ( int ( $orientation ) == 8 ) {

  my $status =
   $exif->SetNewValue(
    'EXIF:Orientation#', 1, EditOnly => 1
   );

  $status = $exif->WriteInfo( $file );

  $status == 1 or
   die "unable to write file $file";

  $fix++;

 } else {

  # no need for a fix

  $nofix++;

 }

}

say
 "total: " . ( $fix + $nofix ) .
 " fixed: " . $fix .
 " skipped: " . $nofix;