Valokuvien pelastus muistikortilta

2005-06-08

Yllättäen tuli ongelmia muistikortin kanssa ja jouduin etsimään Linuxilla toimivaa kuvien pelastusohjelmaa. Vaihtoehtoja ei pahemmin ollut, mutta Flashrecover hoiti homman riittävän hyvin.

Pelkkä kuvien pelastus itsessään oli hyvin yksinkertainen:

  1. Kortinlukijan avulla luetaan muistikortista image dd-ohjelmalla. (dd if=/dev/sda of=kortti.img)*
  2. Käsitellään image Flashrecoverilla. (flashrecover.pl kortti.img)
  3. Ohjelma tallentaa kaikki löydetyt kuvatiedostot työhakemistoon, joten enää tarvitsee jollakin kuvienselailuohjelmalla napsia käyttökelpoiset talteen.
  4. Lopuksi kirjoitin kortin täyteen nollaa, jotta myöhemmin vastaava pelastusoperaatio olisi vähän nopeampi. (dd if=/dev/zero of=/dev/sda)* (Luonnollisesti tämä kannattaa tehdä vasta sitten, kun homma on varmasti ohi... ;-) )

* /dev/sda on kortinlukijan laitetiedosto, joka saattaa vaihdella laitteistosta riippuen.

Kaikki kuvat löytyivät ja lisäksi löytyi luonnollisesti paljon aiemmin poistettuja kuvia. Ainut ongelma oli Exif-tietojen puuttuminen kuvista. Ohjelma oli kuvien lisäksi tallentanut exif-tiedot sisältäviä tiedostoja, jotka oli nimetty: Damaged{numero}.jpeg

Exif-tietojen kopiointi pelastettuihin kuviin onnistui jhead -ohjelmalla.

Kopiointia ei kumminkaan tarvinnut tehdä yksitellen jokaista tiedostoa varten vaan, kun ehjät kuvatiedostot, jotka ohjelma oli nimennyt muotoon Cluster{numero}.jpeg ja exif-tiedot sisältävät tiedostot järjesti lopussa olevan numeron perusteella, menivät saman kuvan kuvatiedosto ja exif-tiedosto sopivasti peräkkäin, joten tiedot oli helppo kopioida seuraavanlaisella skriptillä:

#! /bin/bash

# Järjestetään lopussa olevan numeron perusteella,
# joka alkaa 8. merkistä.
tiedostot=(`ls *jpeg | sort -k 1.8n`)
count=$[`ls *jpeg 2> /dev/null | wc -l` - 1]

# Käydään läpi kaikki tiedostot ja mikäli Damaged- ja
# Cluster-alkuiset tiedostot ovat peräkkäin, kopiodaan
# exif-tiedot
for i in `seq 0 $count`; do
  if [[ ${tiedostot[$i]} == Damaged* ]]; then
    if [[ ${tiedostot[$i+1]} == Cluster* ]]; then
      echo "Kopioidaan exif: ${tiedostot[$i]} -> ${tiedostot[$i+1]}"
      jhead -te ${tiedostot[$i]} ${tiedostot[$i+1]}
    fi
  fi
done

Ylläolevan skriptin voit ladata tästä.

Loppuen lopuksi sain siis kuvat ihan normaalia kamerasta kiskottua vastaavaan muotoon, mutta olihan tässä työtä jonkin verran. :-)

blog comments powered by Disqus