Czy mogę wyeksportować bazę danych zdjęć Shotwell, zapisując wszystkie tagi?

14

Zaimportowałem wiele zdjęć do Shotwell i spędziłem trochę czasu na ustawianiu tagów. Czy te znaczniki są zablokowane w Shotwell, czy mogę je wyeksportować (i zaimportować ponownie lub użyć z innym oprogramowaniem)?

Ivan
źródło

Odpowiedzi:

22

Jestem założycielem Yorby, twórcy Shotwell. Dziękuję za twoje pytanie.

Shotwell 0.7 zapisuje metadane (takie jak tagi i tytuły) na zdjęciach podczas ich eksportowania. Metadane są zapisywane w formacie EXIF, IPTC i / lub XMP (w zależności od tego, które z nich były na początku na zdjęciu). Większość innych programów fotograficznych może odczytywać te formaty, więc jeśli eksportujesz swoje zdjęcia ze Shotwell, inne programy powinny mieć możliwość odczytu ich tagów bez problemu.

Nadchodzący Shotwell 0.8 może zapisywać metadane do plików zdjęć w locie - aby to włączyć, wybierz opcję „ Zapisuj tagi, tytuły i inne metadane do plików zdjęć ” w oknie dialogowym preferencji . Po wybraniu tej opcji Shotwell zaktualizuje metadane w plikach zdjęć, jak tylko je otagujesz. Aby skorzystać z tej funkcji, zbuduj pień Shotwell ze źródła (patrz http://yorba.org/shotwell/install/#source ) lub po prostu poczekaj na Shotwell 0.8 (który planujemy wydać później w grudniu).

Adam Dingle
źródło
+1 Jestem nowym użytkownikiem Shotwell; dziękuję za całą dobrą pracę.
msw
3
Czy pisanie tagów w locie działa wstecz?
hultqvist
@hultqvist, tak, właśnie zaznaczyłem opcję i shotwell zacząłem później pisać do wszystkich moich zdjęć
jakiś użytkownik
9

Niestety, Shotwell wydaje się przechowywać tagi we własnej bazie danych zamiast osadzać je jako exif, IPTC lub XMP na zdjęciach. Możesz to sprawdzić za pomocą exiftool, który można zainstalować, instalując pakiet libimage-exiftool-perl , dostępny w repozytoriach.

Zobacz kilka przykładów tutaj

użyj polecenia; exiftool testpicture.jpgaby sprawdzić zdjęcie o nazwie testpicture.jpg, które wcześniej oznaczyłeś tagiem Shotwell. Zobaczysz, że wyjście exiftool nie zawiera tagów Shotwell.

Narzędzie exiftool może oznaczać twoje zdjęcia, umieszczając tagi na zdjęciu, a dobrą rzeczą jest to, że większość menedżerów zdjęć będzie z nich korzystać, w tym Shotwell. Na przykład:

exiftool -keywords=favourite -keywords=family testpicture.jpg

Zastąp istniejącą listę słów kluczowych dwoma nowymi słowami kluczowymi (ulubionym i rodzinnym).

Po zaimportowaniu pliku testpicture.jpg do Shotwell zdjęcie zostanie oznaczone jako ulubione i rodzinne

Pomocna może być informacja, że ​​baza danych Shotwell jest bazą danych sqlite w twoim; ~/.shotwell/datakatalogu i zwykle nazywa się photo.db, możesz skopiować go gdzie indziej na komputerze i uzyskać do niego dostęp za pomocą narzędzia sqlite.

Istnieje kilka nakładki GUI dla SQLite, jest jeden dla Firefoksa tutaj lub użyć sqliteman . Oba te interfejsy mają funkcje eksportu do csv; kiedy eksportujesz swoje tagi do csv (wartości rozdzielane przecinkami), możesz sprawdzić, czy jakiekolwiek inne oprogramowanie do zarządzania zdjęciami zaimportuje i zamapuje tagi na odpowiednie pola we własnych bazach danych. Wierzę, że Digikam może to zrobić. Digikam może również osadzać dane exif na samych zdjęciach.

Mamy nadzieję, że wraz ze wzrostem liczby funkcji Shotwell sytuacja się zmieni.

AKTUALIZACJA: Chociaż prawdą jest, że Shotwell 0.7 nie przechowuje swoich znaczników na zdjęciach podczas tworzenia tych znaczników, znaczniki można osadzić na zdjęciach, jeśli zdecydujesz się je wyeksportować, dzięki Adamowi za wyjaśnienie. Mamy nadzieję, że ten eksport jest bezstratny w przypadku plików JPEG. Podejrzewam, że tak, jeśli wybierzesz oryginalny rozmiar dla opcji Skalowanie w oknie dialogowym eksportu.

Sabacon
źródło
1
Jeśli podczas eksportu opcja skalowania ma rozmiar oryginalny, a zdjęcie nie jest edytowane (bez korekty kolorów, przycinania itp.), Jest bezstratne. Pamiętaj, że zmiana orientacji zdjęcia jest również bezstratna, ponieważ używamy flagi EXIF, a nie ponownie kodujemy obrócony obraz.
Jim Nelson
Wierzę, że możesz zaznaczyć pole „Zapisuj tagi, tytuły i inne metadane w plikach zdjęć” w preferencjach Shetwell, aby zapisywały tagi w plikach obrazów.
JellicleCat
2

Szybki (brudny?) Kod Pythona, aby to zrobić bez aktualizacji Shotwell (myślę, że od wersji 0.8.x Shotwell może wypisywać tagi, ale nie możesz uaktualnić do tego w Lucid). Ta rzecz wypisze gwiazdki jako tagi (skomentuj to, oczywiście, jeśli tego nie chcesz).

Wymaga exiftool. Powielą wszystkie tagi, które są zarówno w bazie danych shotwell ORAZ obrazy (tj. Te, które Shotwell zaimportował podczas importowania obrazów), więc uważaj na to. Dużo kolekcji zdjęć zajmuje też sporo czasu.

import os
conn = sqlite3.connect("/home/  username  /.shotwell/data/photo.db")

def get_tags():
    return [ x[0] for x in conn.execute("SELECT name FROM TagTable").fetchall()]

def tag_query(tag):
    return conn.execute("SELECT photo_id_list FROM TagTable WHERE name=?", (tag,)).fetchone()[0].split(",")

def get_tagged_photos(tag):
    for id in tag_query(tag):
        result = conn.execute("select filename from PhotoTable where id=?", (id,) ).fetchone()
        if result:
            yield result[0]

def get_photos_by_rating(rating):
    return [photo[0] for photo in conn.execute("select filename from PhotoTable where rating=?",(rating,)).fetchall()]

def get_tagging_commands():
    commands = []
    for rating in range(1,5):
        for photo in get_photos_by_rating(rating):
             commands.append("exiftool -overwrite_original_in_place -preserve -keywords+=rating%d \"%s\""% (rating,photo))

    for tag in [tag for tag in get_tags() if tag != "keep"]:
        for photo in get_tagged_photos(tag):
             commands.append("exiftool -overwrite_original_in_place -preserve -keywords+=%s \"%s\"" % (tag,photo))

    return commands

commands = get_tagging_commands()
for command in commands:
    print command
    os.system(command)
użytkownik38122
źródło
0

Jeśli potrzebujesz naprawdę dobrego narzędzia / przeglądarki GUI, które pozwoli Ci oznaczać zdjęcia przy użyciu tagów Exif (i dlatego też dostępne w Shotwell), polecam jBrout .

Mam napisane o jBrout na moim blogu .

Aby go zainstalować, przejdź do Synaptic, wybierz ustawienia / repozytoria, kliknij kartę „Inne oprogramowanie”, a następnie kliknij przycisk „Dodaj” i wklej w tym wierszu:

deb http://jbrout.free.fr/download/debian binary /

Następnie załaduj ponownie i wyszukaj jBrout.

Scaine
źródło
0

Ponieważ ~/.shotwell/data/photo.dbjest identyfikowany jako photo.db: SQLite 3.x databaseprzez polecenie pliku, użyłem SQLite Database Browser( sqlitebrowser), aby go otworzyć.

Hmmm ... możesz to przeczytać :-) Posiada funkcję eksportu CVS.

To nie jest normalne podejście do GUI, ale jest na to sposób.

Osamu Aoki
źródło
0

Próbowałem użyć skryptu użytkownika38122 do analizowania bazy danych shotwell, ale to nie zadziałało. Najwyraźniej schemat został zmieniony w ostatnich wersjach. Zamiast tego napisałem następujący skrypt, który używa pand (które osobiście wolę pisać SQL) do wykonywania przecięć znaczników. W poniższym przykładzie pokazuję wszystkie obrazy, które mają zarówno znacznik „cat”, jak i znacznik „sleep”.

#!/usr/bin/python

# An example of how to query the shotwell database with pandas
import sqlite3, pandas, os, time, datetime

con = sqlite3.connect('/home/dov/.local/share/shotwell/data/photo.db')
photo_df = pandas.read_sql("SELECT * from PhotoTable", con)

for c in ['exposure_time','timestamp','time_created']:
  photo_df[c] = photo_df[c].map(datetime.datetime.fromtimestamp)

tag_df = pandas.read_sql('SELECT * from TagTable', con)

def get_image_ids(tag):
  """The image ids are stored morphed in the database as %016x"""
  global tag_df

  return set([int(s.replace('thumb',''),16)
              for s in tag_df[tag_df.name==tag].photo_id_list.iloc[0].split(',')
              if len(s)])

def get_photos(ids):
  """Get the photos for a list of ids"""
  global photo_df
  return photo_df[photo_df.id.isin(ids)].sort(['exposure_time'])

def view_pix(rows):
  cmd = ('eog ' + ' '.join(['"%s"'%row.filename
                            for idx,row in rows.iterrows()]))
#  print cmd
  os.system(cmd)

print 'querying...'

# An example of how to create an intersection of two tags
ids1 = get_image_ids('cat')
ids2 = get_image_ids('sleeping')
rows = get_photos(ids1.intersection(ids2))

# An example of how to filter the rows by timestamp
time_low,time_high = datetime.datetime(2006,8,1),datetime.datetime(2009,1,1)
rows = rows[(rows.exposure_time > time_low)
            & (rows.exposure_time < time_high)]
print '\n'.join([str(ts) for ts in rows['exposure_time']])
view_pix(rows)

print 'done'
Dow Grobgeld
źródło