Sida 1 av 2
Kan man läsa från jpg header delen med ett bash skript?
Postat: 24 apr 2010, 11:22
av BadOmen
Hej,
jag vill komma åt "Datum för tagning:" delen i en jpg fil från ett bash skript, går det och i så fall hur?
Alltså inte senast ändrad datum utan den delen som är sparad i jpg filens header del som visar när bilden är tagen.
Re: Kan man läsa från jpg header delen med ett bash skript?
Postat: 24 apr 2010, 11:47
av andol
Det är alltså exif-informationen du vill åt? En variant då är att installera paketet
exif, vilket innehåller ett kommandoradsprogram med samma namn.
Re: Kan man läsa från jpg header delen med ett bash skript?
Postat: 24 apr 2010, 12:33
av BadOmen
andol skrev:Det är alltså exif-informationen du vill åt? En variant då är att installera paketet
exif, vilket innehåller ett kommandoradsprogram med samma namn.
Tack det verkar som jag kan få ut det jag behöver med det

Re: Kan man läsa från jpg header delen med ett bash skript?
Postat: 24 apr 2010, 13:08
av dmz
BadOmen skrev:Hej,
jag vill komma åt "Datum för tagning:" delen i en jpg fil från ett bash skript, går det och i så fall hur?
Det går.
Kod: Markera allt
hexdump -C foo.jpg|grep -P '(:?[0-9]{4}:[0-9]{2}:[0-9]{2})'|awk '{print $18}'|tail -1|perl -pe 's/\|//g'
Re: Kan man läsa från jpg header delen med ett bash skript?
Postat: 24 apr 2010, 13:27
av BadOmen
dmz skrev:BadOmen skrev:Hej,
jag vill komma åt "Datum för tagning:" delen i en jpg fil från ett bash skript, går det och i så fall hur?
Det går.
Kod: Markera allt
hexdump -C foo.jpg|grep -P '(:?[0-9]{4}:[0-9]{2}:[0-9]{2})'|awk '{print $18}'|tail -1|perl -pe 's/\|//g'
Tack tack, där fick jag fram precis bara datumet
Jag tror dock att jag har tagit mig vatten över huvudet... Det jag egentligen vill kunna göra är att sortera bilder efter det datum dom är tagna och inte det Datum de är inlagda på hårddisken.
Tänkte nåt i stil med en array[filnamn][Datum] och sen sortera efter datum och visa det i terminalen... Får nog fundera lite på om jag ska ge mig in i det här, det en bra bit över min kunskapsnivå...

Re: Kan man läsa från jpg header delen med ett bash skript?
Postat: 24 apr 2010, 13:35
av dmz
Det är väl inga problem? Kan hända att jag missförstår vad du vill göra nu, men...
Kod: Markera allt
mv foo.jpg $( hexdump -C foo.jpg|grep -P '(:?[0-9]{4}:[0-9]{2}:[0-9]{2})'|awk '{print $18}'|tail -1|perl -pe 's/\|//g'|perl -pe 's/$/\.jpg/')
gör det inte ungefär vad du vill?
Nu är ovanstående inget jag är stolt över (5 pipes!), och i den sista pipen så vill du nog kolla vilken extension filen har från början...
Re: Kan man läsa från jpg header delen med ett bash skript?
Postat: 24 apr 2010, 13:47
av BadOmen
dmz skrev:Det är väl inga problem? Kan hända att jag missförstår vad du vill göra nu, men...
Kod: Markera allt
mv foo.jpg $( hexdump -C foo.jpg|grep -P '(:?[0-9]{4}:[0-9]{2}:[0-9]{2})'|awk '{print $18}'|tail -1|perl -pe 's/\|//g'|perl -pe 's/$/\.jpg/')
gör det inte ungefär vad du vill?
Nu är ovanstående inget jag är stolt över (5 pipes!), och i den sista pipen så vill du nog kolla vilken extension filen har från början...
Nja jag tror inte det, den där döper väll om filen till datumet då filen togs?
Jag vill kunna söka bland mina bilder och ange att bilden ska vara tagen nån gång mellan 2010-04-25 och 2010-04-28 och då bara visa de bilderna oavsett vad de heter.
Jag tänkte först få det att funka med att den bara sorterar efter när kortet togs och när det funkar lägga in att man kan specificera inom vilken tidsintervall man är intresserad av och då bara få de bilderna inom det tidsintervallet visat upp för en.
Re: Kan man läsa från jpg header delen med ett bash skript?
Postat: 24 apr 2010, 13:50
av dmz
Kod: Markera allt
#!/usr/bin/perl
# renames IMG_0008.JPG to something like 2010:04:24_12:16:03.jpg
use strict;
use Image::ExifTool;
use Data::Dumper;
use File::Copy;
my $e = Image::ExifTool->new;
my @files = @ARGV or die "Need files!";
foreach my $file(@files) {
my $ext;
if($file =~ /.+\.(.+)$/) {
$ext = lc($1);
}
else {
$ext = "unknown";
}
my $info = $e->ImageInfo($file);
my $filename = $info->{DateTimeOriginal}.".$ext";
$filename =~ s/\s+/_/g;
move("$file", "$filename") or die "Cant move $file to $filename: $!";
}
Re: Kan man läsa från jpg header delen med ett bash skript?
Postat: 24 apr 2010, 13:52
av dmz
BadOmen skrev:
Tänkte nåt i stil med en array[filnamn][Datum] och sen sortera efter datum och visa det i terminalen... Får nog fundera lite på om jag ska ge mig in i det här, det en bra bit över min kunskapsnivå...

Aha... nu förstår jag. För lite kaffe idag...
Ja, säg till om du vill ha hjälp med det också...
Re: Kan man läsa från jpg header delen med ett bash skript?
Postat: 24 apr 2010, 14:12
av BadOmen
dmz skrev:BadOmen skrev:
Tänkte nåt i stil med en array[filnamn][Datum] och sen sortera efter datum och visa det i terminalen... Får nog fundera lite på om jag ska ge mig in i det här, det en bra bit över min kunskapsnivå...

Aha... nu förstår jag. För lite kaffe idag...
Ja, säg till om du vill ha hjälp med det också...
Hehehe
Vad du har gjort är att återskapa en del av jhead

:
http://linux.die.net/man/1/jhead
http://linux.softpedia.com/get/Multimed ... -401.shtml
Vill du sitta och pilla vidare på min lilla idé så får du gärna göra det, kanske du själv skulle kunna ha nytta av det skriptet nån gång. Det skulle heller inte skada ifall det var rekursivt så man kan få upp även de bilder som stämmer överens med ens kriterier men ligger i nån undermapp
Det lär nog ta ett bra tag innan jag har fått till det... och jag har tyvärr inte så mycket tid att sitta framför datorn i helgen, egentligen ingen tid alls

Re: Kan man läsa från jpg header delen med ett bash skript?
Postat: 25 apr 2010, 08:01
av dmz
Kod: Markera allt
#!/usr/bin/perl
use strict;
use Image::ExifTool;
my %filedata;
%filedata = map {$_ => 1 } @ARGV or die "Need files!";
my $e = Image::ExifTool->new;
foreach my $file(keys(%filedata)) {
my $info = $e->ImageInfo($file);
$filedata{$file} = $info->{DateTimeOriginal};
$filedata{$file} =~ s/://g;
}
foreach my $file(sort{$filedata{$a} <=> $filedata{$b}} keys(%filedata)) {
printf("%20s | %s\n", $file, $filedata{$file});
}
Kod: Markera allt
> perl jpgshit.pl *.jpg
img_0079.jpg | 20090610 180939
img_0077.jpg | 20090610 180919
img_0082.jpg | 20090610 181024
img_0078.jpg | 20090610 180928
img_0081.jpg | 20090610 181008
img_0084.jpg | 20090610 181057
img_0080.jpg | 20090610 180952
img_0083.jpg | 20090610 181038
img_0134.jpg | 20090613 212457
img_0120.jpg | 20090613 203743
img_0127.jpg | 20090613 211411
Re: Kan man läsa från jpg header delen med ett bash skript?
Postat: 27 apr 2010, 18:53
av BadOmen
Ser man på, du har redan hunnit fixa ett litet skript.
Jag som just loggade in här för att lägga in början på ett skript
Kod: Markera allt
#!/usr/bin/env python
import os
from PIL import Image
EXTENSIONS = ('.jpg', '.JPG', '.jpeg')
for root, dirs, files in os.walk('/home/jonas/temp/bildtest/testbilderna'):
for name in files:
im=Image.open(os.path.join(root, name))
for ext in EXTENSIONS:
if name.endswith(ext):
if hasattr(im, '_getexif'):
exifdata = im._getexif()
ctime = exifdata[0x0132]
print name," ", ctime
Det jag behöver nu är bara att klura ut hur jag ska få in "name och "ctime" i en två dimentionell array. Sen är det bara att sortera den så får jag det i rätt ordning.
Som det är nu så går den igenom undermapparna och sen skriver den ut namnet och tiden då bilderna skapades dock inte sorterat.
Vist är det vad ditt skript också gör? det ser inte ut som det sorteras.
Eftersom jag tar det här som en chans att lära mig lite python så tror jag att jag kör vidare på det jag har börjat med, perl tror jag är svårare att lära sig.
Om du har en aning om hur jag får in det i en array så har jag inget emot en liten hint

jag testade att göra typ så här
Kod: Markera allt
mList=[[1][2]]
mList[[1]]=name
mList[[2]]=ctime
TypeError: list indices must be integers, not list
men som du ser på felmeddelandet så gick det inte så bra... J
Re: Kan man läsa från jpg header delen med ett bash skript?
Postat: 28 apr 2010, 01:10
av dmz
Jodå, det sorteras ju efter datum/tid, vilket väl var vad du ville?
Jag kan ingenting om python, men har för mig att det är dictionaries du vill kolla på... motsvarigheten till en hash i perl.
En array av arrays kommer inte att fungera särskilt bra - vad händer t.ex med de filer som inte har något datum?
Re: Kan man läsa från jpg header delen med ett bash skript?
Postat: 28 apr 2010, 10:40
av BadOmen
dmz skrev:Jodå, det sorteras ju efter datum/tid, vilket väl var vad du ville?
Jag kan ingenting om python, men har för mig att det är dictionaries du vill kolla på... motsvarigheten till en hash i perl.
En array av arrays kommer inte att fungera särskilt bra - vad händer t.ex med de filer som inte har något datum?
Jag har inte provkört ditt skript bara kollat på det men jag trodde att den sista kodrutan du har lagt in var utdatan fråpn skriptet och det verkar bara vara sorterad efter datum och inte efter tid. Det funkar ju bra om man vill se vilket kort som är taget mellan vissa datum men om man vill visa dom i ett bildspel så vore det ännu bättre om de dessutom sorterades efter tid så att man kan visa upp en serie bilder i rätt följd.
(mint grundtanke börjar utvecklas... får se hur långt jag orkar/lyckas ta mig.... Det skulle vara coolt att ha ett bildvisningsprogram som fugerar lite som musikspelare, med spellistor. Då skulle det här skriptet kunna lägga in en spellista av bilder enligt användarens önskemål.)
Jag hade tänkt att ifall filen saknar tid så skulle den inte visas alls. För då vet man inte mellan vilken tidsperiod bilden togs vilket är grundtanken här, att man ska kunna specificera mellan vilka datum bilderna man vill se är tagna. Om man skulle vilja ha som alternativ att skriptet även visar de filer som saknar datum så skulle man kunna sortera i första hand efter datum och tid och i andra hand efter sökväg och filnamn. På så vis borde man kunna hantera både de som har ett datum och de som saknar ett. Eftersom man kan lägga till sökvägen till bilden så blir det inte två bilder med identiska namn som det hade kunnat bli ifall man skippade sökvägen.
Tack för dictionaries tipset, ska genast läsa på om det.

Re: Kan man läsa från jpg header delen med ett bash skript?
Postat: 28 apr 2010, 11:23
av dmz
Nu kan du specificera önskade datum med
-span;
Kod: Markera allt
> perl imgshit.pl *.jpg -span 20090613
img_0134.jpg | 20090613
img_0120.jpg | 20090613
img_0127.jpg | 20090613
Kod: Markera allt
#!/usr/bin/perl
#imgshit
use strict;
use Image::ExifTool;
use Getopt::Long;
use Data::Dumper;
if(!@ARGV) {
print << "USAGE";
$0 [OPTIONS] files
OPTIONS
-span <timespan>
USAGE
exit 0;
}
our($optSpan);
GetOptions('span:s' => \$optSpan);
my %filedata;
%filedata = map {$_ => 1 } @ARGV or die "Need files!";
my $e = Image::ExifTool->new;
foreach my $file(keys(%filedata)) {
chomp($filedata{$file});
my $info = $e->ImageInfo($file);
my $date = $info->{DateTimeOriginal};
my $time;
if($date =~ /([0-9]+:[0-9]+:[0-9]+)(.+)/) {
$date = $1;
$date =~ s/://g;
$time = $2;
$filedata{$file} = $date;
}
}
foreach my $file(sort{$filedata{$a} <=> $filedata{$b}} keys(%filedata)) {
if($optSpan) {
if($filedata{$file} =~ /$optSpan/) {
# print Dumper $filedata{$file}, "\n";
printf("%20s | %s\n", $file, $optSpan);
}
}
#printf("%20s | %s\n", $file, $filedata{$file});
}
Re: Kan man läsa från jpg header delen med ett bash skript?
Postat: 28 apr 2010, 12:14
av BadOmen
Perfekt

Själv har jag precis fått in det i dictionary och försöker nu komma på hur man kan sortera den
Kod: Markera allt
#!/usr/bin/env python
import os
from PIL import Image
dicImg= {}
i=1
EXTENSIONS = ('.jpg', '.JPG', '.jpeg')
for root, dirs, files in os.walk('/home/jonas/temp/bildtest/testbilderna'):
for name in files:
# print os.path.join(root, name) # typ if namnet inte slutar pa
im=Image.open(os.path.join(root, name))
for ext in EXTENSIONS:
if name.endswith(ext):
if hasattr(im, '_getexif'):
exifdata = im._getexif()
ctime = exifdata[0x0132]
#print name," ", ctime
dicImg[i]=[ (os.path.join(root, name)), (ctime) ]
print dicImg[i]
i=+1
./exifPILjonas.py
['/home/jonas/temp/bildtest/testbilderna/DSC_3983.JPG', '2010:01:05 15:54:10']
['/home/jonas/temp/bildtest/testbilderna/DSC_6669.JPG', '2010:04:16 08:49:58']
['/home/jonas/temp/bildtest/testbilderna/DSC_6443.JPG', '2010:04:05 15:26:50']
['/home/jonas/temp/bildtest/testbilderna/DSC_6449.JPG', '2010:04:05 15:27:01']
['/home/jonas/temp/bildtest/testbilderna/undermapp/bildpamig.JPG', '2010:04:05 15:26:50']
Re: Kan man läsa från jpg header delen med ett bash skript?
Postat: 28 apr 2010, 13:31
av dmz
Vad jobbigt python ser ut... jag är rätt säker på att det är Perl du vill koda ;>
Re: Kan man läsa från jpg header delen med ett bash skript?
Postat: 28 apr 2010, 14:59
av BadOmen
dmz skrev:Vad jobbigt python ser ut... jag är rätt säker på att det är Perl du vill koda ;>
hehehe, det är nästan så jag håller med dig, men jag ska försöka köra på med python ett tag till iaf

Re: Kan man läsa från jpg header delen med ett bash skript?
Postat: 28 apr 2010, 19:28
av BadOmen
Jag har brutit ut den här python frågan till en egen tråd då rubriken här är lite missvisande...
http://ubuntu-se.org/phpBB3/viewtopic.php?f=35&t=47945
Re: Kan man läsa från jpg header delen med ett bash skript?
Postat: 29 apr 2010, 06:15
av Substrata
Varför inte sätta modified time för filen till samma angivelse som exif anger? Då följer ju sorteringen närmast automatiskt, oavsett gränssnitt för att lista filerna.