我可以导出保存所有标签的 Shotwell 图片数据库吗?

我可以导出保存所有标签的 Shotwell 图片数据库吗?

我已经将很多图片导入 Shotwell,并花了一些时间设置标签。这些标签是否锁定在 Shotwell 中,或者我可以导出它们(然后再次导入或与其他软件一起使用)?

答案1

我是 Yorba 的创始人,也是 Shotwell 的制造者。谢谢你的提问。

Shotwell 0.7 会在您导出照片时将元数据(如标签和标题)写入照片。元数据以 EXIF、IPTC 和/或 XMP 格式写入(取决于照片中最初存在的格式)。大多数其他照片程序都可以读取这些格式,因此如果您从 Shotwell 导出照片,那么其他程序应该能够毫无问题地读取它们的标签。

即将推出的 Shotwell 0.8 可以即时将元数据写入照片文件 -要启用此功能,请选择选项“将标签、标题和其他元数据写入照片文件“在首选项对话框中。选择此选项后,Shotwell 会在您标记照片文件后立即更新照片文件中的元数据。要使用此功能,请从源构建 Shotwell 主干(请参阅http://yorba.org/shotwell/install/#source),或者等待 Shotwell 0.8(我们计划在 12 月下旬发布)。

答案2

不幸的是,Shotwell 似乎将标签保存在自己的数据库中,而不是将它们作为 exif、IPTC 或 XMP 嵌入到图片中。您可以使用 exiftool 进行检查,该工具可通过安装包来安装libimage-exiftool-perl,可在存储库中使用。

参见此处的一些示例

使用命令;exiftool testpicture.jpg检查一张名为 testpicture.jpg 的照片,该照片之前已用 Shotwell 标记。您将看到 exiftool 输出不包含 Shotwell 标签。

exiftool 实用程序可以标记您的照片,将标签嵌入照片中,这样做的好处是大多数照片管理器都会使用它们,其中包括 Shotwell。例如:

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

用两个新关键词(favourite 和 family)替换现有的关键词列表。

当 testpicture.jpg 导入 Shotwell 时,该图片将被标记为收藏和家人

了解 Shotwell 数据库是一个位于您的~/.shotwell/data目录中的 sqlite 数据库可能会有所帮助;通常称为 photo.db,您可以将其复制到计算机上的其他位置并使用 sqlite 访问它。

sqlite 有几个 GUI 前端,有一个用于火狐浏览器或者你可以使用sqliteman。这两个前端都具有导出到 csv 的功能;当您将标签导出到 csv(逗号分隔值)时,您可以检查是否有任何其他照片管理软件会导入标签并将其映射到其自己数据库中的相应字段。我相信 Digikam 可以做到这一点。Digikam 还可以将 exif 数据嵌入照片本身。

希望随着 Shotwell 获得更多功能,这种情况会有所改变。

更新:虽然 Shotwell 0.7 在创建标签时不会将其标签存储在图片中,但如果您选择导出标签,则可以将标签嵌入图片中,感谢 Adam 澄清了这一点。希望此导出在处理 jpeg 时是无损的。我怀疑是的,如果在导出对话框中为“缩放”选项选择原始大小。

答案3

无需升级 Shotwell 即可快速(肮脏?)地使用 Python 代码完成此操作(我认为从 0.8.x 开始,Shotwell 可以写出标签,但您无法在 Lucid 上升级到该版本)。此程序将以标签形式写出星级评定(如果您不想要,请注释掉该部分,显然)。

需要 exiftool。它会复制 shotwell 数据库和图像中的任何标签(即 Shotwell 在导入图像时导入的标签),因此请注意这一点。此外,收集大量照片需要相当长的时间。

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)

答案4

由于被文件命令~/.shotwell/data/photo.db识别为,我使用()来打开它。 photo.db: SQLite 3.x databaseSQLite Database Browsersqlitebrowser

嗯...你可以阅读它:-)它具有 CVS 导出功能。

这不是正常的 GUI 方法,但有一种方法。

相关内容