加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python利用PIL库读取图片的EXIF信息

发布时间:2020-12-17 17:26:34 所属栏目:Python 来源:网络整理
导读:今天PHP站长网 52php.cn把收集自互联网的代码分享给大家,仅供参考。 ? # -*- coding: Windows-1251 -*-'''rename_to_exiftime.pyRename JPEG files according to EXIF-date using PILIf global variable CREATE_HARDLINK

以下代码由PHP站长网 52php.cn收集自互联网

现在PHP站长网小编把它分享给大家,仅供参考

?
# -*- coding: Windows-1251 -*-
'''
rename_to_exiftime.py

Rename JPEG files according to EXIF-date using PIL

If global variable CREATE_HARDLINK is set,script creates Windows (XP) batch file 
for creating hardlink version of source files

Author: Denis Barmenkov <[email?protected]>

Modified by: Jorge Barnaby <[email?protected]>
Improved rename process on duplicates

Copyright: this code is free,but if you want to use it,please keep this multiline comment along with function source. 
           Thank you.

2009-02-10 18:14 
'''

import Image

import os
import re
import sys
import time

CREATE_HARDLINK=0

def extract_jpeg_exif_time(jpegfn):
    if not os.path.isfile(jpegfn):
        return None
    try:
        im = Image.open(jpegfn)
        if hasattr(im,'_getexif'):
            exifdata = im._getexif()
            ctime = exifdata[0x9003]
            #print ctime
            return ctime
    except: 
        _type,value,traceback = sys.exc_info()
        print "Error:n%r",value

    return None

def get_exif_prefix(jpegfn):
    ctime = extract_jpeg_exif_time(jpegfn)
    if ctime is None:
        return None
    ctime = ctime.replace(':','')
    ctime = re.sub('[^d]+','_',ctime)
    return ctime

def rename_jpeg_file(fn):
    if not os.path.isfile(fn):
        return 0
    ext = os.path.splitext(fn)[1].lower()
    if ext not in ['.jpg','.jpeg','.jfif','.nef','.png']:
        return 0
    path,base = os.path.split(fn)
    #print base # status
    prefix = get_exif_prefix(fn)
    if prefix is None:
        print '%s could not be renamed' % (base)
        return 0
    if base.startswith(prefix):
        print '%s file already renamed' % (base)
        return 0 # file already renamed to this prefix

    exists = True
    index = 0
    while exists:
        if index == 0:
            new_name = prefix + ext # + '_' + base
        else:
            new_name = prefix + '_' + str(index) + ext
        new_full_name = os.path.join(path,new_name)
        exists = os.path.isfile(new_full_name)
        index = index + 1

    if CREATE_HARDLINK:
        f = open('CREATE_HARDLINK.cmd','a')
        f.write('fsutil hardlink create "%s" "%s"n' % (new_full_name,fn))
        f.close()
    else:
        try:
            os.rename(fn,new_full_name)
            print '%s renamed to %s' % (base,new_name) 
        except:
            print 'ERROR rename %s --> %s' % (fn,new_full_name)
            return 0

    return 1

def rename_jpeg_files_in_dir(dn):
    names = os.listdir(dn)
    count=0
    for n in names:
        file_path = os.path.join(dn,n)
        count += rename_jpeg_file(file_path)
    return count

if __name__=='__main__':
    try:
        path = sys.argv[1]
    except IndexError:
        print '''Usage:  

  rename_to_exiftime.py  filename.[jpeg|jpg|jfif]

or

  rename_to_exiftime.py  dirname
'''
        sys.exit(1)

    if os.path.isfile(path):
        rename_jpeg_file(path)
    elif os.path.isdir(path):
        count = rename_jpeg_files_in_dir(path)
        print '%d file(s) renamed.' % count
    else:
        print 'ERROR: path not found: %s' % path

PIL 库下载地址: http://www.pythonware.com/products/pil/

以上内容由PHP站长网【52php.cn】收集整理供大家参考研究

如果以上内容对您有帮助,欢迎收藏、点赞、推荐、分享。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读