欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2016年09月11日 10:50:07   投稿:daisy  
這篇文章介紹了利用Python讀取圖片屬性信息的方法,讀取的內(nèi)容包括GPS 信息、圖片分辨率、圖片像素、設備商、拍攝設備等,有需要的朋友們可以參考借鑒。

本文是利用Python腳本讀取圖片信息,有幾個說明如下:

     1、沒有實現(xiàn)錯誤處理

     2、沒有讀取所有信息,大概只有 GPS 信息、圖片分辨率、圖片像素、設備商、拍攝設備等

     3、簡單修改后應該能實現(xiàn)暴力修改圖片的 GPS 信息

     4、但對于本身沒有 GPS 信息的圖片,實現(xiàn)則非常復雜,需要仔細計算每個描述符的偏移量

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


腳本讀取的信息

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


圖片信息1


圖片信息2

源碼如下

# -*- coding:utf-8 -*-
import binascii

class 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讀取圖片屬性信息的實現(xiàn)方法到這就基本結(jié)束了,大家都學會了嗎?希望這篇文章對大家的學習或者工作帶來一定的幫助,

相關文章

  • python打開使用的方法

    python打開使用的方法

    在本篇文章里小編給各位整理的是關于python怎么打開使用的相關知識點內(nèi)容,有需要的朋友們可以學習下。
    2019-09-09
  • 淺談python import引入不同路徑下的模塊

    淺談python import引入不同路徑下的模塊

    下面小編就為大家?guī)硪黄獪\談python import引入不同路徑下的模塊。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07
  • 基于Python代碼實現(xiàn)Apriori?關聯(lián)規(guī)則算法

    基于Python代碼實現(xiàn)Apriori?關聯(lián)規(guī)則算法

    這篇文章主要介紹了基于Python代碼實現(xiàn)Apriori?關聯(lián)規(guī)則算法,本文通過應用場景舉例,結(jié)合示例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2022-03-03
  • Python實現(xiàn)修改Excel文件的元數(shù)據(jù)

    Python實現(xiàn)修改Excel文件的元數(shù)據(jù)

    這篇文章將通過使用Python、Openpyxl模塊以及wxPython庫,實現(xiàn)創(chuàng)建一個GUI界面來輸入元數(shù)據(jù),然后將這些元數(shù)據(jù)與Excel文件一起保存,感興趣的可以了解一下
    2023-04-04
  • Python OpenCV視頻截取并保存實現(xiàn)代碼

    Python OpenCV視頻截取并保存實現(xiàn)代碼

    這篇文章主要介紹了Python OpenCV視頻截取并保存實現(xiàn)代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-11-11
  • python實現(xiàn)unicode轉(zhuǎn)中文及轉(zhuǎn)換默認編碼的方法

    python實現(xiàn)unicode轉(zhuǎn)中文及轉(zhuǎn)換默認編碼的方法

    這篇文章主要介紹了python實現(xiàn)unicode轉(zhuǎn)中文及轉(zhuǎn)換默認編碼的方法,結(jié)合實例形式分析了Python針對Unicode編碼操作的相關技巧及編碼轉(zhuǎn)換中的常見問題解決方法,需要的朋友可以參考下
    2017-04-04
  • Python的dict字典結(jié)構操作方法學習筆記

    Python的dict字典結(jié)構操作方法學習筆記

    這篇文章主要介紹了Python的dict字典結(jié)構操作方法學習筆記本,字典的操作是Python入門學習中的基礎知識,需要的朋友可以參考下
    2016-05-05
  • Python合并pdf文件的工具

    Python合并pdf文件的工具

    PDF文件合并工具是非常好用可以把多個pdf文件合并成一個,本文以5個pdf文件為例給大家分享具體操作方法,通過實例代碼給大家介紹的非常詳細,需要的朋友參考下吧
    2021-07-07
  • 基于python實現(xiàn)KNN分類算法

    基于python實現(xiàn)KNN分類算法

    這篇文章主要為大家詳細介紹了基于python實現(xiàn)KNN分類算法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • Python 的 with 語句詳解

    Python 的 with 語句詳解

    這篇文章主要介紹了Python 的 with 語句,本文詳細講解了with語句、with語句的歷史、with語句的使用例子等,需要的朋友可以參考下
    2014-06-06

最新評論