Kan man läsa från jpg header delen med ett bash skript?

Här diskuteras programmering och utveckling
Användarvisningsbild
BadOmen
Inlägg: 1172
Blev medlem: 18 aug 2006, 10:45
OS: Kubuntu
Utgåva: 24.04 Noble Numbat LTS
Ort: Umeå

Kan man läsa från jpg header delen med ett bash skript?

Inlägg 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.
Betygsätt din Hårdvara och underlätta inköp av ny för andra:http://ubuntu-se.org/phpBB3/viewforum.php?f=138
Ubuntu-se forsknings team, här.
Min Ubuntu blogg som funkar som en stor post-it lapp för mig http://attminnas.blogspot.com/
andol
Inlägg: 3093
Blev medlem: 31 dec 2007, 00:19
OS: Ubuntu
Utgåva: 23.10 Mantic Minotaur

Re: Kan man läsa från jpg header delen med ett bash skript?

Inlägg 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.
Användarvisningsbild
BadOmen
Inlägg: 1172
Blev medlem: 18 aug 2006, 10:45
OS: Kubuntu
Utgåva: 24.04 Noble Numbat LTS
Ort: Umeå

Re: Kan man läsa från jpg header delen med ett bash skript?

Inlägg 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 =)
Betygsätt din Hårdvara och underlätta inköp av ny för andra:http://ubuntu-se.org/phpBB3/viewforum.php?f=138
Ubuntu-se forsknings team, här.
Min Ubuntu blogg som funkar som en stor post-it lapp för mig http://attminnas.blogspot.com/
Användarvisningsbild
dmz
Inlägg: 3292
Blev medlem: 29 jul 2008, 19:42
OS: Arch Linux

Re: Kan man läsa från jpg header delen med ett bash skript?

Inlägg 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'
ǁ A: Because it obfuscates the reading.
ǁ Q: Why is top posting so bad?
Användarvisningsbild
BadOmen
Inlägg: 1172
Blev medlem: 18 aug 2006, 10:45
OS: Kubuntu
Utgåva: 24.04 Noble Numbat LTS
Ort: Umeå

Re: Kan man läsa från jpg header delen med ett bash skript?

Inlägg 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å... :)
Betygsätt din Hårdvara och underlätta inköp av ny för andra:http://ubuntu-se.org/phpBB3/viewforum.php?f=138
Ubuntu-se forsknings team, här.
Min Ubuntu blogg som funkar som en stor post-it lapp för mig http://attminnas.blogspot.com/
Användarvisningsbild
dmz
Inlägg: 3292
Blev medlem: 29 jul 2008, 19:42
OS: Arch Linux

Re: Kan man läsa från jpg header delen med ett bash skript?

Inlägg 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...
ǁ A: Because it obfuscates the reading.
ǁ Q: Why is top posting so bad?
Användarvisningsbild
BadOmen
Inlägg: 1172
Blev medlem: 18 aug 2006, 10:45
OS: Kubuntu
Utgåva: 24.04 Noble Numbat LTS
Ort: Umeå

Re: Kan man läsa från jpg header delen med ett bash skript?

Inlägg 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.
Betygsätt din Hårdvara och underlätta inköp av ny för andra:http://ubuntu-se.org/phpBB3/viewforum.php?f=138
Ubuntu-se forsknings team, här.
Min Ubuntu blogg som funkar som en stor post-it lapp för mig http://attminnas.blogspot.com/
Användarvisningsbild
dmz
Inlägg: 3292
Blev medlem: 29 jul 2008, 19:42
OS: Arch Linux

Re: Kan man läsa från jpg header delen med ett bash skript?

Inlägg 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: $!";
}
Senast redigerad av 1 dmz, redigerad totalt 24 gånger.
ǁ A: Because it obfuscates the reading.
ǁ Q: Why is top posting so bad?
Användarvisningsbild
dmz
Inlägg: 3292
Blev medlem: 29 jul 2008, 19:42
OS: Arch Linux

Re: Kan man läsa från jpg header delen med ett bash skript?

Inlägg 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å...
ǁ A: Because it obfuscates the reading.
ǁ Q: Why is top posting so bad?
Användarvisningsbild
BadOmen
Inlägg: 1172
Blev medlem: 18 aug 2006, 10:45
OS: Kubuntu
Utgåva: 24.04 Noble Numbat LTS
Ort: Umeå

Re: Kan man läsa från jpg header delen med ett bash skript?

Inlägg 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 :P
Betygsätt din Hårdvara och underlätta inköp av ny för andra:http://ubuntu-se.org/phpBB3/viewforum.php?f=138
Ubuntu-se forsknings team, här.
Min Ubuntu blogg som funkar som en stor post-it lapp för mig http://attminnas.blogspot.com/
Användarvisningsbild
dmz
Inlägg: 3292
Blev medlem: 29 jul 2008, 19:42
OS: Arch Linux

Re: Kan man läsa från jpg header delen med ett bash skript?

Inlägg 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
  
ǁ A: Because it obfuscates the reading.
ǁ Q: Why is top posting so bad?
Användarvisningsbild
BadOmen
Inlägg: 1172
Blev medlem: 18 aug 2006, 10:45
OS: Kubuntu
Utgåva: 24.04 Noble Numbat LTS
Ort: Umeå

Re: Kan man läsa från jpg header delen med ett bash skript?

Inlägg 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
Betygsätt din Hårdvara och underlätta inköp av ny för andra:http://ubuntu-se.org/phpBB3/viewforum.php?f=138
Ubuntu-se forsknings team, här.
Min Ubuntu blogg som funkar som en stor post-it lapp för mig http://attminnas.blogspot.com/
Användarvisningsbild
dmz
Inlägg: 3292
Blev medlem: 29 jul 2008, 19:42
OS: Arch Linux

Re: Kan man läsa från jpg header delen med ett bash skript?

Inlägg 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?
ǁ A: Because it obfuscates the reading.
ǁ Q: Why is top posting so bad?
Användarvisningsbild
BadOmen
Inlägg: 1172
Blev medlem: 18 aug 2006, 10:45
OS: Kubuntu
Utgåva: 24.04 Noble Numbat LTS
Ort: Umeå

Re: Kan man läsa från jpg header delen med ett bash skript?

Inlägg 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. =)
Betygsätt din Hårdvara och underlätta inköp av ny för andra:http://ubuntu-se.org/phpBB3/viewforum.php?f=138
Ubuntu-se forsknings team, här.
Min Ubuntu blogg som funkar som en stor post-it lapp för mig http://attminnas.blogspot.com/
Användarvisningsbild
dmz
Inlägg: 3292
Blev medlem: 29 jul 2008, 19:42
OS: Arch Linux

Re: Kan man läsa från jpg header delen med ett bash skript?

Inlägg 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});
}
ǁ A: Because it obfuscates the reading.
ǁ Q: Why is top posting so bad?
Användarvisningsbild
BadOmen
Inlägg: 1172
Blev medlem: 18 aug 2006, 10:45
OS: Kubuntu
Utgåva: 24.04 Noble Numbat LTS
Ort: Umeå

Re: Kan man läsa från jpg header delen med ett bash skript?

Inlägg av BadOmen »

Perfekt :D
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']
Betygsätt din Hårdvara och underlätta inköp av ny för andra:http://ubuntu-se.org/phpBB3/viewforum.php?f=138
Ubuntu-se forsknings team, här.
Min Ubuntu blogg som funkar som en stor post-it lapp för mig http://attminnas.blogspot.com/
Användarvisningsbild
dmz
Inlägg: 3292
Blev medlem: 29 jul 2008, 19:42
OS: Arch Linux

Re: Kan man läsa från jpg header delen med ett bash skript?

Inlägg av dmz »

Vad jobbigt python ser ut... jag är rätt säker på att det är Perl du vill koda ;>
ǁ A: Because it obfuscates the reading.
ǁ Q: Why is top posting so bad?
Användarvisningsbild
BadOmen
Inlägg: 1172
Blev medlem: 18 aug 2006, 10:45
OS: Kubuntu
Utgåva: 24.04 Noble Numbat LTS
Ort: Umeå

Re: Kan man läsa från jpg header delen med ett bash skript?

Inlägg 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 ;)
Betygsätt din Hårdvara och underlätta inköp av ny för andra:http://ubuntu-se.org/phpBB3/viewforum.php?f=138
Ubuntu-se forsknings team, här.
Min Ubuntu blogg som funkar som en stor post-it lapp för mig http://attminnas.blogspot.com/
Användarvisningsbild
BadOmen
Inlägg: 1172
Blev medlem: 18 aug 2006, 10:45
OS: Kubuntu
Utgåva: 24.04 Noble Numbat LTS
Ort: Umeå

Re: Kan man läsa från jpg header delen med ett bash skript?

Inlägg 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
Betygsätt din Hårdvara och underlätta inköp av ny för andra:http://ubuntu-se.org/phpBB3/viewforum.php?f=138
Ubuntu-se forsknings team, här.
Min Ubuntu blogg som funkar som en stor post-it lapp för mig http://attminnas.blogspot.com/
Användarvisningsbild
Substrata
Inlägg: 71
Blev medlem: 13 apr 2010, 11:01
OS: Arch Linux
Utgåva: Vet inte/ingen utgåva passar

Re: Kan man läsa från jpg header delen med ett bash skript?

Inlägg 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.
Skriv svar

Återgå till "Programmering och webbdesign"