国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > Python > 正文

Python讀取圖片屬性信息的實(shí)現(xiàn)方法

2019-11-25 16:34:45
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

本文是利用Python腳本讀取圖片信息,有幾個(gè)說(shuō)明如下:

     1、沒(méi)有實(shí)現(xiàn)錯(cuò)誤處理

     2、沒(méi)有讀取所有信息,大概只有 GPS 信息、圖片分辨率、圖片像素、設(shè)備商、拍攝設(shè)備等

     3、簡(jiǎn)單修改后應(yīng)該能實(shí)現(xiàn)暴力修改圖片的 GPS 信息

     4、但對(duì)于本身沒(méi)有 GPS 信息的圖片,實(shí)現(xiàn)則非常復(fù)雜,需要仔細(xì)計(jì)算每個(gè)描述符的偏移量

腳本運(yùn)行后,讀取結(jié)果如下


腳本讀取的信息

這里和 Windows 屬性查看器讀到的內(nèi)容完全一致


圖片信息1


圖片信息2

源碼如下

# -*- coding:utf-8 -*-import binasciiclass ParseMethod(object):  @staticmethod  def parse_default(f, count, offset):    pass  @staticmethod  def parse_latitude(f, count, offset):    old_pos = f.tell()    f.seek(12 + offset)    latitude = [0,0,0]    for i in xrange(count):      byte = f.read(4)      numerator = byte.encode('hex')      byte = f.read(4)      denominator = byte.encode('hex')      latitude[i] = float(int(numerator, 16)) / int(denominator, 16)    print 'Latitude:/t%.2f %.2f/' %.2f/"' % (latitude[0], latitude[1], latitude[2])    f.seek(old_pos)    @staticmethod  def parse_longtitude(f, count, offset):    old_pos = f.tell()    f.seek(12 + offset)    longtitude = [0,0,0]    for i in xrange(count):      byte = f.read(4)      numerator = byte.encode('hex')      byte = f.read(4)      denominator = byte.encode('hex')      longtitude[i] = float(int(numerator, 16)) / int(denominator, 16)    print 'Longtitude:/t%.2f %.2f/' %.2f/"' % (longtitude[0], longtitude[1], longtitude[2])    f.seek(old_pos)   @staticmethod  def parse_make(f, count, offset):    old_pos = f.tell()    f.seek(12 + offset)    byte = f.read(count)    a = byte.encode('hex')    print 'Make:/t/t' + binascii.a2b_hex(a)    f.seek(old_pos)   @staticmethod  def parse_model(f, count, offset):    old_pos = f.tell()    f.seek(12 + offset)    byte = f.read(count)    a = byte.encode('hex')    print 'Model:/t/t' + binascii.a2b_hex(a)    f.seek(old_pos)       @staticmethod  def parse_datetime(f, count, offset):    old_pos = f.tell()    f.seek(12 + offset)    byte = f.read(count)    a = byte.encode('hex')    print 'DateTime:/t' + binascii.a2b_hex(a)    f.seek(old_pos)  # rational data type, 05  @staticmethod  def parse_xresolution(f, count, offset):    old_pos = f.tell()    f.seek(12 + offset)    byte = f.read(4)    numerator = byte.encode('hex')    byte = f.read(4)    denominator = byte.encode('hex')    xre = int(numerator, 16) / int(denominator, 16)    print 'XResolution:/t' + str(xre) + ' dpi'    f.seek(old_pos)  @staticmethod  def parse_yresolution(f, count, offset):    old_pos = f.tell()    f.seek(12 + offset)    byte = f.read(4)    numerator = byte.encode('hex')    byte = f.read(4)    denominator = byte.encode('hex')    xre = int(numerator, 16) / int(denominator, 16)    print 'YResolution:/t' + str(xre) + ' dpi'    f.seek(old_pos)  @staticmethod  def parse_exif_ifd(f, count, offset):    old_pos = f.tell()    f.seek(12 + offset)    byte = f.read(2)    a = byte.encode('hex')        exif_ifd_number = int(a, 16)    for i in xrange(exif_ifd_number):      byte = f.read(2)      tag_id = byte.encode('hex')      #print tag_id,      byte = f.read(2)      type_n = byte.encode('hex')      #print type_n,      byte = f.read(4)      count = byte.encode('hex')      #print count,      byte = f.read(4)      value_offset = byte.encode('hex')      #print value_offset      value_offset = int(value_offset, 16)      EXIF_IFD_DICT.get(tag_id, ParseMethod.parse_default)(f, count, value_offset)    f.seek(old_pos)    @staticmethod  def parse_x_pixel(f, count, value):    print 'X Pixels:/t' + str(value)  @staticmethod  def parse_y_pixel(f, count, value):    print 'y Pixels:/t' + str(value)  @staticmethod  def parse_gps_ifd(f, count, offset):    old_pos = f.tell()        f.seek(12 + offset)    byte = f.read(2)    a = byte.encode('hex')      gps_ifd_number = int(a, 16)    for i in xrange(gps_ifd_number):      byte = f.read(2)      tag_id = byte.encode('hex')      #print tag_id,      byte = f.read(2)      type_n = byte.encode('hex')      #print type_n,      byte = f.read(4)      count = byte.encode('hex')      #print count,      byte = f.read(4)      value_offset = byte.encode('hex')      #print value_offset      count = int(count, 16)      value_offset = int(value_offset, 16)      GPS_IFD_DICT.get(tag_id, ParseMethod.parse_default)(f, count, value_offset)    f.seek(old_pos) IFD_dict = {  '010f' : ParseMethod.parse_make ,  '0110' : ParseMethod.parse_model ,  '0132' : ParseMethod.parse_datetime ,  '011a' : ParseMethod.parse_xresolution ,  '011b' : ParseMethod.parse_yresolution ,  '8769' : ParseMethod.parse_exif_ifd ,  '8825' : ParseMethod.parse_gps_ifd}EXIF_IFD_DICT = {  'a002' : ParseMethod.parse_x_pixel ,  'a003' : ParseMethod.parse_y_pixel}GPS_IFD_DICT = {  '0002' : ParseMethod.parse_latitude ,  '0004' : ParseMethod.parse_longtitude}with open('image.jpg', 'rb') as f:  byte = f.read(2)  a = byte.encode('hex')  print 'SOI Marker:/t' + a  byte = f.read(2)  a = byte.encode('hex')  print 'APP1 Marker:/t' + a  byte = f.read(2)  a = byte.encode('hex')  print 'APP1 Length:/t' + str(int(a, 16)) + ' .Dec'  byte = f.read(4)  a = byte.encode('hex')  print 'Identifier:/t' + binascii.a2b_hex(a)  byte = f.read(2)  a = byte.encode('hex')  print 'Pad:/t/t' + a   print   print 'Begin to print Header.... '  print 'APP1 Body: '  byte = f.read(2)  a = byte.encode('hex')  print 'Byte Order:/t' + a    byte = f.read(2)  a = byte.encode('hex')  print '42:/t/t' + a   byte = f.read(4)  a = byte.encode('hex')  print '0th IFD Offset:/t' + a   print 'Finish print Header'  print 'Begin to print 0th IFD....'  print  #print 'Total: ',  byte = f.read(2)  a = byte.encode('hex')  interoperability_number = int(a, 16)  #print interoperability_number  for i in xrange(interoperability_number):    byte = f.read(2)    tag_id = byte.encode('hex')    #print tag_id,    byte = f.read(2)    type_n = byte.encode('hex')    #print type_n,    byte = f.read(4)    count = byte.encode('hex')    #print count,    byte = f.read(4)    value_offset = byte.encode('hex')    #print value_offset    count = int(count, 16)    value_offset = int(value_offset, 16)    # simulate switch    IFD_dict.get(tag_id, ParseMethod.parse_default)(f, count, value_offset)  print  print 'Finish print 0th IFD....'

總結(jié)

利用Python讀取圖片屬性信息的實(shí)現(xiàn)方法到這就基本結(jié)束了,大家都學(xué)會(huì)了嗎?希望這篇文章對(duì)大家的學(xué)習(xí)或者工作帶來(lái)一定的幫助,

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 林甸县| 安远县| 南部县| 周口市| 东源县| 札达县| 济源市| 凤翔县| 平邑县| 姚安县| 武威市| 阜康市| 昌乐县| 阳信县| 蓬莱市| 南乐县| 始兴县| 罗山县| 阿克陶县| 长武县| 诏安县| 鹿泉市| 岗巴县| 长岛县| 上饶市| 东光县| 浦东新区| 永登县| 宜宾县| 资溪县| 新郑市| 玉龙| 台北县| 德兴市| 阿拉善左旗| 郧西县| 波密县| 正定县| 巴楚县| 龙南县| 长汀县|