精华内容
下载资源
问答
  • 每过一段时间手机里的照片就要清理一遍,备份到硬盘,但是时间越久,记忆越模糊,只能大概记得一张照片哪里、什么状态下拍的,却很难回忆起来具体的时间,所以想到将照片名字改成拍摄时间,这样就很方便以后...

     

    每过一段时间,手机里的照片就要清理一遍,备份到硬盘上,但是时间越久,记忆越模糊,只能大概记得一张照片是在哪里、什么状态下拍的,却很难回忆起来具体的时间,所以想到将照片名字改成拍摄时间,这样就很方便以后查看了。

    不是所有图片的 exif 中都包含有时间信息的, 我最早用的手机是小米,后来用的苹果,拍照的图片都是 .JPG 格式,.PNG大多是截图,还有几张 .JPG不知道是什么原因,也拿不到时间,所以要过滤一下。

    另外还有同名的 .AEE(小米)  .MOV(苹果) 文件 , 要同步修改一下名字。

    具体代码如下,exif中除了时间信息,还有手机机型、位置等一系列信息。

    
    import PIL.Image
    import PIL.ExifTags
    import os
    
    
    def modify_pic_name():
        os.chdir(r'H:\picture_back\1111')
        jpg_map = {}
        for f in os.listdir():
            if not (f.endswith('.JPG')):
                continue
            img = PIL.Image.open(f)
            exif = {
                PIL.ExifTags.TAGS[k]: v
                for k, v in img._getexif().items()
                if k in PIL.ExifTags.TAGS
            }
            try:
                date_time = exif['DateTime']
            except:
                date_time = ''
            if date_time == '':
                continue
            print(f, date_time)
            date_time = date_time.replace(':', '').replace(' ', '-')
            jpg_map[f] = date_time
        for kv in jpg_map.keys():
            date_time = jpg_map[kv]
            i = 1
            while os.path.exists(date_time + '.JPG'):
                date_time = date_time + '+' + str(i)
                i += 1
            os.rename(kv, date_time + '.JPG')
            mov_name = kv[:-4] + '.MOV'
            if (os.path.exists(mov_name)):
                os.rename(mov_name, date_time + '.MOV')
            aee_name = kv[:-4] + '.AEE'
            if (os.path.exists(aee_name)):
                os.rename(aee_name, date_time + '.AEE')
    
    
    if __name__ == '__main__':
        modify_pic_name()
    

    另外 exifread 模块也可以获取到exif 。

    展开全文
  • 这样把相片导出到电脑时,很容易造成新旧照片重名的现象(尤其是所有照片都保存电脑的同一文件夹内)。该软件能批量以图片文件的最后修改日期来重命名 jpg 格式的照片,命名规则为 IMG_20130616_164235 这样的...
  • 照片的GPS位置信息读取

    千次阅读 2019-06-18 15:36:02
    手机、相机拍摄的照片会自带一些诸如拍摄时间、地点、镜头型号、曝光度、图像尺寸等附加信息,Windows可以通过右键文件属性查看和修改相关参数。 EXIF (exchangeable image file format) 就是此类信息的简称。 ...

    一、照片的 EXIF信息

    手机、相机拍摄的照片会自带一些诸如拍摄时间、地点、镜头型号、曝光度、图像尺寸等附加信息,在Windows上可以通过右键文件属性查看和修改相关参数。

    EXIF (exchangeable image file format) 就是此类信息的简称。

    Python第三方包 exifread 为读取 照片 EXIF信息提供方便。

     

    二、 照片的 GPS信息

    照片EXIF信息中记录了照片拍摄时的GPS 经纬度信息,通过高德提供的开发者工具可以进一步解析出具体的地址信息,具体方法实现如下:

    # !/usr/bin/python3
    # coding: utf-8
    import json
    import os
    import traceback
    
    import exifread
    import requests
    
    
    def parse_gps_express(gps_express):
        '''
        GPS坐标表达式转数值
        :param gps_express: GPS坐标表达式 [1,2,3/4]
        :return: GPS坐标数值 1.033542
        '''
        try:
            express = str(gps_express).replace(" ", "").replace("[", "").replace("]", "")
            parts = express.split(",")
            subpart = parts[2].split("/")
    
            degrees = float(parts[0])
            minutes = float(parts[1])
            seconds = float(subpart[0]) / float(subpart[1])
            return degrees + minutes / 60 + seconds / 3600
        except:
            raise Exception("Error information for the picture")
    
    
    def photo_gps(photo_path):
        '''
        照片拍摄地GPS坐标
        :param photo_path: 照片的磁盘路径
        :return: 照片的 (GPS经度,GPS纬度)
        '''
        if not os.path.isfile(photo_path):
            raise Exception("File is not exist")
    
        with open(photo_path, 'rb') as f:
            exif_dict = exifread.process_file(f)
            longitude_ref = str(exif_dict["GPS GPSLongitudeRef"]).strip()
            longitude = parse_gps_express(str(exif_dict["GPS GPSLongitude"]))
            latitude_ref = str(exif_dict["GPS GPSLatitudeRef"]).strip()
            latitude = parse_gps_express(str(exif_dict["GPS GPSLatitude"]))
    
        lng = longitude if "E" == longitude_ref else 0 - longitude
        lat = latitude if "N" == latitude_ref else 0 - latitude
        return lng, lat
    
    
    def convert_gps(gps_coordinates):
        '''
        坐标转换:GPS转高德
        :param gps_coordinates: 多个位置(GPS经度,GPS纬度)的集合
        :return: 多个位置(高德经度,高德纬度)的集合
        '''
        try:
            coordinates = "|".join(gps_coordinates) # 最多批量查询40个
            token = "cb1c527f67df87bdc3a72f8a75987e62" # 自行申请,免费
    
            url = "https://restapi.amap.com/v3/assistant/coordinate/convert" \
                  "?locations={0}&key={1}&coordsys=gps&output=json".format(coordinates, token)
    
            response = requests.get(url) # 个人开发者访问限流:100000次/日
            result = json.loads(response.text)
            if "1" == result["status"]:
                return result["locations"].split(";")
            else:
                raise Exception(result["info"])
        except Exception as e:
            raise e
    
    
    def map_address(gd_coordinates):
        '''
        逆地理编码(高德坐标转地址)
        :param gd_coordinates:多个位置(高德经度,高德纬度)的集合
        :return:多个位置地址信息的集合
        '''
        try:
            coordinates = "|".join(gd_coordinates) # 最多批量查询20个
            token = "cb1c527f67df87bdc3a72f8a75987e62" # 自行申请,免费
            batch = "true" if len(gd_coordinates) > 1 else "false"
    
            url = "https://restapi.amap.com/v3/geocode/regeo" \
                  "?location={0}&key={1}&batch={2}&radius=500&extensions=base&output=json".format(coordinates, token, batch)
    
            response = requests.get(url) # 个人开发者访问限流:6000次/日
            result = json.loads(response.text)
            if "1" == result["status"]:
                address = []
                if "true" == batch:
                    add_lst = list(result["regeocodes"])
                    for add in add_lst:
                        address.append(add["formatted_address"])
                else:
                    fmt_add = result["regeocode"]["formatted_address"]
                    address.append(fmt_add)
                return address
            else:
                raise Exception(result["info"])
        except Exception as e:
            raise e
    
    
    if __name__ == '__main__':
        try:
            lng1, lat1 = photo_gps("d:/1.jpg")
            lng2, lat2 = photo_gps("d:/2.jpg")
            lng3, lat3 = photo_gps("d:/3.jpg")
    
            gps_coordinates = list()
            gps_coordinates.append("%s,%s" % (lng1, lat1))
            gps_coordinates.append("%s,%s" % (lng2, lat2))
            gps_coordinates.append("%s,%s" % (lng3, lat3))
    
            gd_coordinates = convert_gps(gps_coordinates)
            addresses = map_address(gd_coordinates)
            for add in addresses:
                print(add)
        except:
            traceback.print_exc()
    

     

    代码中明示的token为我个人所有,仅供交流学习,不可用于任何商业活动。

    实现细节的建议:高德限制用户日访问次数,为避免不必要麻烦,建议多用批量查询。

     

     

    参考资料

    1、《高德关于访问token的生成的说明》

    2、《高德关于访问流量限制的说明》

    3、《GPS坐标转换高德坐标方法说明》

    4、《高德关于地理/逆地理转换说明》

     

    展开全文
  • iis里的服务器扩展里新建一个叫Rwrite的扩展名,指到D:\Rwrite\Rewrite.dll,点允许运行,打开iis,前台站点点右键>>属性>>ISAPI筛选器>>添加>>名称和服务器扩展里刚才建的对应 ●设置iis的Mime 类型属性以...
  • 职问答,是PC网站相关功能移动触屏站的延伸。个人和企业会员都可以随时随地参与问答互动。 微职场,主要提供职场指南类资讯。 找普工,为企业提供快速招聘服务,主要是普工类职位信息。 二、查工资 查工资可以...
  • a、出去玩拍了好多照片手机容量小,想电脑存储起来 b、今天存储照片的位置可能明天就找不到了,最好能有个软件能够统一管理一下 c、闲暇的时候想看看曾经全家人一起去过的地方 (3)假设 a、电脑已经装...

    场景

    工作项序号004:查看导入照片,最后修改时间:2017/7/6

    1、背景

    (1)典型用户:王女士

    (2)用户的需求/迫切需要解决的问题

    a、出去玩拍了好多照片,手机容量小,想在电脑上存储起来

    b、今天存储照片的位置可能明天就找不到了,最好能有个软件能够统一管理一下

    c、闲暇的时候想看看曾经全家人一起去过的地方

    (3)假设

    a、电脑上已经装了我们的软件

    b、王女士已经基本会用我们的软件

    2、场景

     

    王女士在又一次的全家旅游回来后,打开了我们的TOUCH App,首先看到了之前录入的所有照片图库,接着录入这次的所有图片,点击左面菜单栏“设置”进入设置界面,点击“添加图片”添加她存放照片的各个目录。点击“完成”后,她点击“图库”返回图库界面。稍等一会,等待系统扫描图片完毕,她就可以看到这几个文件夹里的所有图片,都按照时间顺序罗列在图库界面中了。

    所有文件夹里的所有图片都在同一个界面中按照时间顺序罗列出(新的图片在列表的最上面,旧的在最下面)。

    在日后工作的闲暇时间里,王女士打开TOUCH,从图库中又重新看了一遍先前的照片

     

    转载于:https://www.cnblogs.com/kaer791414167/p/7128829.html

    展开全文
  • 28.修复:在手机端当用户绑定商家后进行充值,充值到了商家帐号中;29.修复:当商品从有规格变成无规格时,没有删除商品规格的bug;30.修复:小程序充值管理,充值金额显示错误的bug;31.修复: app提现时没有排除充值送...
  • 视频相册可以电脑用播放器收看、也可以刻录成DVD、VCD光盘,放到视频网站和朋友分享、或者传输到手机、ipad、平板电脑、psp等移动设备收看。 艾奇视频电子相册制作软件是一款由专业视频技术研发团队“艾奇软件...
  • 该客户端能够让您任何时间,任何地点,打开您的坚果云文件夹,阅读文档、查看相册、上传、分享照片、记录笔记。 特点:全平台自动同步 无需手动上传下载,任意文件自动同步到电脑、手机、平板和云端,随时随地...
  • 邮寄时,请信封的左下角写修改稿”及稿件原编号。请一定保证打印稿与电子版的一致。 请注意:我们收到最终修改稿后,将不再受理有任何改动的修改稿 E-mail: crad@ict.ac.cn http://crad.ict.ac.cn 电 话...
  • 而且提供校友资料导出下载功能,您可以把导出的Excel文件保存您的电脑,手机,PDA或者其他移动存储介质中, 这样就可以不方便上网的时候及时查找校友资料,或者也可以打印为纸质通讯录,组织校友活动, 组织...
  • 在手机的内存中创建并修改一个csv文件。 麦克风 该应用程序具有声音计模式,可使用麦克风分析声音。 什么是新的 在设置菜单中添加了当前传感器采样率频率。 修复了磁力计模式下高斯单位的错误。 Bug修复...
  • 10.2 GPS轨迹记录器——利用LocationListener地图画图并换算距离 10.3 女性贴身看护——AlarmManager.DatePicker.TimePicker 10.4 手机QRCode二维条形码生成器——Canvas与SurfaceHolder绘图 10.5 AndroidQRCode...
  • 【技师管理】 技师姓名、照片、编号、职位、技师提成、可作项目、技师手机端业绩 【项目管理】 项目分类、项目检索、会员价、游客价、服务时间、描述 【套餐管理】 计次套餐、组合套餐 【房间管理】 房间名称、房间...
  • 网上教学系统

    2013-04-06 23:37:42
    3.2 用户理解,大学生学习网需要定期或不定期地对提供网络服务的平台(如互联网网站、移动网络等)或相关的设备进行检修或者维护,如因此类情况而造成收费网络服务合理时间内的中断,大学生学习网无需为此承担...
  • 新版Android开发教程.rar

    千次下载 热门讨论 2010-12-14 15:49:11
    谷歌早 2002 年就进入了移动领域,可是由于目前的手机操作系统企业和手机企业相对封闭,提高了 行业的进入门槛,移动互联网的发展远没有拥有统一标准的传统互联网发展迅速,此次推出的开源手机操 作 系统平台就是...
  • 实例143 删除上传到服务器指定文件夹中的数码照片 231 实例144 批量上传数码相片 232 5.5 Panel容器控件 236 实例145 使用Panel控件显示或隐藏一组控件 236 实例146 动态切换Panel容器中的内容 237 5.6 日历控件 239...
  • 实例143 删除上传到服务器指定文件夹中的数码照片 231 实例144 批量上传数码相片 232 5.5 Panel容器控件 236 实例145 使用Panel控件显示或隐藏一组控件 236 实例146 动态切换Panel容器中的内容 237 5.6 日历控件 239...
  • 实例143 删除上传到服务器指定文件夹中的数码照片 231 实例144 批量上传数码相片 232 5.5 Panel容器控件 236 实例145 使用Panel控件显示或隐藏一组控件 236 实例146 动态切换Panel容器中的内容 237 5.6 日历控件 239...
  • 成果间的关联:比如先出的施工图,然后一段时间后再出了对这个图纸的修改通知单,那么修改单关联这个图纸后,每次看这个图纸,就知道这个图纸有修改了,需要引起注意; 多人建立相同项目和目录,可以实现目录中的...
  • iPhone开发秘籍(第2版)--源代码

    热门讨论 2012-12-11 13:51:22
    7.4 秘诀:拍摄照片并将照片写到相册 210 7.5 秘诀:将图片保存到Documents文件夹 212 7.6 秘诀:通过电子邮件发送图片 213 7.7 秘诀:捕捉定时拍摄的照片 214 7.8 秘诀:使用定制摄像头覆盖图 216 7.9 秘诀...
  • 实例287 状态栏中实时显示当前系统时间 实例288 带进度条的状态栏 实例289 制作动画效果的状态栏 第12章 Windows高级控件的使用 12.1 对话框组件的使用 实例290 获得弹出对话框的相关返回值 实例291 使用...
  • 实例287 状态栏中实时显示当前系统时间 实例288 带进度条的状态栏 实例289 制作动画效果的状态栏 第12章 Windows高级控件的使用 12.1 对话框组件的使用 实例290 获得弹出对话框的相关返回值 实例291 使用...
  • 实例287 状态栏中实时显示当前系统时间 实例288 带进度条的状态栏 实例289 制作动画效果的状态栏 第12章 Windows高级控件的使用 12.1 对话框组件的使用 实例290 获得弹出对话框的相关返回值 实例291 使用...
  •  实例073 使用正则表达式验证手机号 89  实例074 使用正则表达式验证身份证号 90  实例075 使用正则表达式验证两位小数 91  实例076 使用正则表达式验证一年的12个月份 92  实例077 使用正则表达式验证一个...
  • 实例073 使用正则表达式验证手机号 89 实例074 使用正则表达式验证身份证号 90 实例075 使用正则表达式验证两位小数 91 实例076 使用正则表达式验证一年的12个月份 92 实例077 使用正则表达式验证一个月的31天 93 ...
  • 实例130 在修改数据时使用函数 231 3.23 删除数据 232 实例131 用DELETE子句删除部分数据 232 实例132 删除表中所有数据 234 实例133 带有子查询的DELETE语句 235 实例134 删除表中多余的重复行数据 235 实例...
  • 实例130 在修改数据时使用函数 231 3.23 删除数据 232 实例131 用DELETE子句删除部分数据 232 实例132 删除表中所有数据 234 实例133 带有子查询的DELETE语句 235 实例134 删除表中多余的重复行数据 235 实例...
  • 实例035 使用嵌套循环控制台输出九九乘法表 实例036 用while循环计算1+1/2!+1/3!…1/20! 实例037 for循环输出空心的菱形 实例038 foreach循环优于for循环 实例039 终止循环体 实例040 循环体的过滤器 实例...
  • 实例035 使用嵌套循环控制台输出九九乘法表 实例036 用while循环计算1+1/2!+1/3!…1/20! 实例037 for循环输出空心的菱形 实例038 foreach循环优于for循环 实例039 终止循环体 实例040 循环体的过滤器 实例...

空空如也

空空如也

1 2
收藏数 38
精华内容 15
关键字:

在手机上修改照片时间