Valokuvien pelastus muistikortilta
2005-06-08Yllä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:
- Kortinlukijan avulla luetaan muistikortista image dd-ohjelmalla.
(
dd if=/dev/sda of=kortti.img)* - Käsitellään image Flashrecoverilla. (
flashrecover.pl kortti.img) - Ohjelma tallentaa kaikki löydetyt kuvatiedostot työhakemistoon, joten enää tarvitsee jollakin kuvienselailuohjelmalla napsia käyttökelpoiset talteen.
- 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. :-)