Erstellungsdatum von RAW auslesen

n_e_r_d

Cadet 4th Year
Registriert
Dez. 2021
Beiträge
97
Hallo, ich möchte mir mit Python ein Programm schreiben, das meine Fotos umbenennen kann.

Dafür möchte ich auf das Erstellungsdatum meiner RAW-Fotos zugreifen.

Ich habe zum Beispiel die Fotos _DSC5777, _DSC5779 und _DSC5780 in einem Ordner liegen und möchte diese zum Beispiel zu "YYYYMMDD_DSC5777" umbenennen.

Python:
import shutil
import os
from shutil import copyfile
from shutil import copystat
from pathlib import Path
from PIL import Image

path = 'C:/Users/Pfad/'

for file in os.listdir("C:/Users/Pfad/"):
    for i in range(5776, 5780):
        if os.path.exists(path + '_DSC' + str(i) + '.ARW'):
            filename = path + '_DSC' + str(i) + '.ARW'
            datum = Image.open(filename)._getexif()[36867]
            datum2 = datetime.datetime.strptime(datum, '%Y%m%d')
            print(datum2)
            os.rename(path + '_DSC' + str(i) + '.ARW', path + datum2 + '_DSC' + str(i) + '.ARW')

Komischerweise funktioniert dieser Code aber nur für JPEG aber für RAW Fotos nicht. Woran liegt das? Funktioniert vielleicht das _getexif() bei RAW nicht?

Danke für eure Hilfe und viele Grüße

n_e_r_d
 
Raw jedes Herstellers ist anders. Kein allgemeines Format.
 
Ne Bibliothek für exif-Daten einbinden und das Datum darüber holen.
https://pypi.org/project/exif/

E: Ah, du hast es ja schon irgendwie über exif versucht. Vielleicht gibt es da unterschiedliche Methoden...
 
madmax2010 schrieb:
Raw jedes Herstellers ist anders. Kein allgemeines Format.
Ok, also ich besitze eine Sony Alpha 6000. Wie funktioniert es da?
Ergänzung ()

kartoffelpü schrieb:
Ne Bibliothek für exif-Daten einbinden und das Datum darüber holen.
https://pypi.org/project/exif/

E: Ah, du hast es ja schon irgendwie über exif versucht. Vielleicht gibt es da unterschiedliche Methoden...
Ja das ist eben die Frage. Oder vielleicht ganz anders als mit exif?
 
Amaoto schrieb:
Da habe ich nur was zu PMP Dateien gefunden (s. Bild im Anhang), was mir aber glaube ich nicht viel weiterhilft.

madmax2010 schrieb:
Das sieht denke ich schon gut aus, aber da reichen ehrlich gesagt meine Programmierkenntnisse nicht aus um das jetzt auf mein Problem zu übertragen.
 

Anhänge

  • Screenshot 2022-01-07 131339.jpg
    Screenshot 2022-01-07 131339.jpg
    123,7 KB · Aufrufe: 233
Was liefert Dir das Tag denn genau zurück? Also der einzelne Aufruf von
datum = Image.open(filename)._getexif()[36867]

Bei dem ARW, das ich von hier habe
https://www.photographyblog.com/previews/sony_a7s_iii_photos
gibt es das Tag 0x9003 (oder zur Not auch 36867)

Wobei das Format korrekt nach EXIF-Standard ist und es mich eher wundert, dass Dein Code mit korrekten JPGs funktionieren soll. Das Ergebnis ist ein ASCII mit den per Doppelpunkt getrennten Werten:
Code:
Exif.Photo.DateTimeOriginal                  Ascii      20  2022:09:10 15:33:09
PS bitte nicht fragen, warum da jemand ein falsches Datum in seinen Testbildern eingestellt hatte.

Ergänzung ()

Falls die von Dir verwendete Library keinen Fehler hat, sollte das funktionieren.

Persönlich habe ich mir die enthaltenen Tags mit exiv2 -pr <Dateiname> angesehen und dann auf der Seite die passende ID zum Tag gesucht:
https://exiv2.org/tags.html
 
Zuletzt bearbeitet:
n_e_r_d schrieb:
Da habe ich nur was zu PMP Dateien gefunden (s. Bild im Anhang), was mir aber glaube ich nicht viel weiterhilft.
Nein, das ist einfach nur die Struktur. ExifTool macht natürlich alles selbst, z.B.:
https://photo.stackexchange.com/que...rename-files-to-match-their-exif-created-date

Wenn du aber noch die JPEG-Dateien in einem konstanten Pfad hast, kannst du natürlich mit deinem Code auch sie benutzen, um das Datum auszulesen und damit dann die gleichnamige ARW-Datei umzubenennen.
 
Da ist der Fehler doch klar:
Cannot identify image........
Entweder gibt es die Datei nicht oder die Library kann mit ARW (bzw. dann gleich mit allen RAWs, da die immer eine TIFF-Struktur nutzen) nicht umgehen.
-> Andere Library nutzen (welche auch immer)
 
gymfan schrieb:
ibrary kann mit ARW (bzw. dann gleich mit allen RAWs, da die immer eine TIFF-Struktur nutzen) nicht umgehen
Genau das hab ich ja in meiner Fragestellung gesagt.

Ich weiß nur eben nicht, welche andere Library ich nutzen soll.

Gerade probiere ich mit ExifTool rum.
 
n_e_r_d schrieb:
Genau das hab ich ja in meiner Fragestellung gesagt.

Ich weiß nur eben nicht, welche andere Library ich nutzen soll.

Gerade probiere ich mit ExifTool rum.
Ich hätte hier schon längst den händischen Weg probiert:

  • RAW-Image raussuchen, dessen möglichst exakten Zeitstempel man kennt (zur Not vorher als JPG exportieren)
  • RAW-Image in Hex-Editor öffnen
  • In den Rohdaten suchen, wo man eine Repräsentation des Datums findet (als String, Integer-Tupel (Tag, Stunde, Minute etc), als Timestamp in Sekunden oder Millisekunden z.B. seit 1.1.1970/epoch etc...)
  • Eine Gemeinsamkeit finden andhand der man die Position des kodierten Datums in beliebigen baugleichen RAW-Bildern der Kamera finden kann
  • Eigenen Parser schreiben (nur für das Datum reicht hier ja)
  • Fertig
 
  • Gefällt mir
Reaktionen: andy_m4
Purche schrieb:
Ich hätte hier schon längst den händischen Weg probiert:
Es hätte auch völlig gereicht, wenn er sich am Anfang die Fehlermeldung angesehen hätte. Dann wäre die Frage "Woran liegt das? Funktioniert vielleicht das _getexif() bei RAW nicht?" beantwortet gewesen.

Purche schrieb:
Eine Gemeinsamkeit finden andhand der man die Position des kodierten Datums in beliebigen baugleichen RAW-Bildern der Kamera finden kann
Die Gemeinsamkeit ist schlicht die TIFF Marker Struktur, in der sich dann auch die EXIF-Tags finden lassen. Anstatt sowas per reverse engeneering zu machen würde ich mich eher an vorhandene Specs halten.

Eine fertige Library zu finden, die das ganze unter Python auch noch plattformunabhängig kann, scheint garnicht so leicht zu sein. Das oben verlinkte pypi exif taugt jedenfalls (dafür) nichts, die Lib meckert bei Nikon-NEFs, dass die ByteOrder falsch wäre. Nachdem aber andere Parser mit diesen Files problemlos umgehen können, liegt das Problem nicht an den Bildern.

Also bleiben wohl nur so konstrukte wie die Nutzung von PyExifTool oder exiv2.
 
gymfan schrieb:
Es hätte auch völlig gereicht, wenn er sich am Anfang die Fehlermeldung angesehen hätte.
Ja aber eine Lösung bringt mir dies auch nicht und du hast wohl auch keine konkrete.
 
Ich möchte nun obiges Programm für jpeg anwenden:

Code:
import shutil
import os
from shutil import copyfile
from shutil import copystat
from pathlib import Path
from PIL import Image

path = 'C:/Users/Pfad/'

for file in os.listdir("C:/Users/Pfad/"):
    for i in range(5776, 5780):
        if os.path.exists(path + '_DSC' + str(i) + '.jpg'):
            filename = path + '_DSC' + str(i) + '.jpg'
            datum = Image.open(filename)._getexif()[36867]
            datum2 = datetime.datetime.strptime(datum, '%Y%m%d')
            print(datum2)
            os.rename(path + '_DSC' + str(i) + '.jpg', path + datum2 + '_DSC' + str(i) + '.jpg')

Leider funktioniert auch das nicht, da ._getexif()[36867] das Datum im Format:
2019:03:28 10:57:51
ausgibt und Windows aber ja keinen Doppelpunkt im Dateinamen akzeptiert. Also versuche ich es mit Zeile 15 umzubenennen, was aber nicht funktioniert, da
NameError: name 'datetime' is not defined

Was muss ich ändern?

Viele Grüße

n_e_r_d
 
n_e_r_d schrieb:
Also versuche ich es mit Zeile 15 umzubenennen, was aber nicht funktioniert, da
NameError: name 'datetime' is not defined
Da ist ein datetime zu viel. Ich würde das aber gar nicht mit einer Zeitfunktion machen. Du hast Doch schon einen String und willst nur die Doppelpunkte loswerden.

Mach doch einfach ein
datum2 = datum.replace(":, "_")

Und dann hast Du doch quasi schon den neuen Dateinamen.
 
Purche schrieb:
Da ist ein datetime zu viel. Ich würde das aber gar nicht mit einer Zeitfunktion machen. Du hast Doch schon einen String und willst nur die Doppelpunkte loswerden.

Mach doch einfach ein
datum2 = datum.replace(":, "_")

Und dann hast Du doch quasi schon den neuen Dateinamen.
Guter Punkt, aber dann müsste ich noch die Uhrzeit entfernen und hier funktioniert
datum3 = datum2.replace("%H %M %S", "")
nicht. Gibt es dafür eine andere Möglichkeit?
 
n_e_r_d schrieb:
Guter Punkt, aber dann müsste ich noch die Uhrzeit entfernen und hier funktioniert
datum3 = datum2.replace("%H %M %S", "")
nicht. Gibt es dafür eine andere Möglichkeit?
Ich würde persönlich zwar die Uhrzeit drin lassen, aber bitte sehr:

datum2 = datum.split(" ")[0].replace(":, "_")
 
  • Gefällt mir
Reaktionen: n_e_r_d
Zurück
Oben