【问题标题】:get Thumbnail image from wikimedia commons从 wikimedia commons 获取缩略图图像
【发布时间】:2016-02-14 20:55:06
【问题描述】:

我确实有一个来自 wikimedia commons 的文件名,我想直接访问缩略图。

示例: Tour_Eiffel_Wikimedia_Commons.jpg

我找到了一种方法来获取包含我想要的缩略图的 url 的 json-data:

https://en.wikipedia.org/w/api.php?action=query&titles=Image:Tour_Eiffel_Wikimedia_Commons.jpg&prop=imageinfo&iiprop=url&iiurlwidth=200

但我不想要另一个请求。有没有办法直接访问缩略图?

【问题讨论】:

    标签: thumbnails wikipedia-api


    【解决方案1】:

    如果您可以相信当前构建 URL 的方式在未来不会改变(不能保证),那么您可以做到。

    网址如下所示:

    https://upload.wikimedia.org/wikipedia/commons/thumb/a/a8/Tour_Eiffel_Wikimedia_Commons.jpg/200px-Tour_Eiffel_Wikimedia_Commons.jpg

    • 第一部分始终相同:https://upload.wikimedia.org/wikipedia/commons/thumb
    • 第二部分是文件名的MD5哈希的第一个字符。在这种情况下,Tour_Eiffel_Wikimedia_Commons.jpg 的 MD5 哈希是a85d416ee427dfaee44b9248229a9cdd,所以我们得到/a
    • 第三部分是上面的 MD5 哈希的前两个字符:/a8
    • 第四部分是文件名:/Tour_Eiffel_Wikimedia_Commons.jpg
    • 最后一部分是所需的缩略图宽度,再次是文件名:/200px-Tour_Eiffel_Wikimedia_Commons.jpg

    【讨论】:

    • 我喜欢它!谢谢!
    • @svick 感谢您的回答 - 它让我走了很长一段路。不过,在用下划线替换文件名中的所有空格后计算 md5 哈希
    • 刚刚了解到,如果图像是 .svg,则需要添加 .png 才能使其正常工作。例如:upload.wikimedia.org/wikipedia/commons/thumb/6/65/Ei-map.svg/…
    【解决方案2】:

    基于@svick的解决方案的Python解决方案:

    import hashlib
    def get_wc_thumb(image, width=300): # image = e.g. from Wikidata, width in pixels
        image = image.replace(' ', '_') # need to replace spaces with underline 
        m = hashlib.md5()
        m.update(image.encode('utf-8'))
        d = m.hexdigest()
        return "https://upload.wikimedia.org/wikipedia/commons/thumb/"+d[0]+'/'+d[0:2]+'/'+image+'/'+str(width)+'px-'+image
    

    【讨论】:

    • 对于图像commons.wikimedia.org/wiki/… 我在m.update(image.encode('utf-8')) 得到UnicodeDecodeError: 'ascii' codec can't decode byte 0xe3 in position 0: ordinal not in range(128)
    【解决方案3】:

    如果有人在 SPARQL 而不是 Python 中执行此查询: SPARQL中有一个MD5函数,整个字符串操作也可以在SPARQL中实现!

      BIND(REPLACE(wikibase:decodeUri(STR(?image)), "http://commons.wikimedia.org/wiki/Special:FilePath/", "") as ?fileName) .
      BIND(REPLACE(?fileName, " ", "_") as ?safeFileName)
      BIND(MD5(?safeFileName) as ?fileNameMD5) .
      BIND(CONCAT("https://upload.wikimedia.org/wikipedia/commons/thumb/", SUBSTR(?fileNameMD5, 1, 1), "/", SUBSTR(?fileNameMD5, 1, 2), "/", ?safeFileName, "/650px-", ?safeFileName) as ?thumb)
     
    

    在 Wikidata 的查询服务中运行此实时查询:here,如下所述:https://discourse-mediawiki.wmflabs.org/t/accessing-a-commons-thumbnail-via-wikidata/499

    【讨论】:

    • 要具有可缩放矢量图形 (SVG) 也可以解决问题——并且只是改进给定的答案——将 …svg.png 附加到 ?safeFileName 就像这样 REPLACE(?safeFileName, "^(.+[Ss][Vv][Gg])$", "$1.png")
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-28
    • 2013-01-01
    • 2012-03-05
    • 2013-12-22
    • 1970-01-01
    • 1970-01-01
    • 2013-09-05
    相关资源
    最近更新 更多