2016-12-22 11 views
1

Я новичок в задании вопросов здесь, я надеюсь, что эта информация - все, что вам нужно, чтобы правильно понять проблему. Заранее благодарю вас за ваше время, отвечая на это.PILL Изображение извлекает exif dict из base64 преобразованных изображений для редактирования и сохранения ошибки, dict return NULL, любые идеи?

ENV: Python 2.7.6, Подушка 3.4.2, Piexif 1.0.8

У меня есть небольшой скрипт, чтобы преобразовать изображение из base_64 в файл изображения; Изображение правильно сохраняется на сервере при выполнении цикла for для массива;

# write decoded image from base to jpg, works perfectly 
fh = open(image_name_location, "wb") 
fh.write(decodestring(image_src)) 
fh.close() 

После этого я хочу то же самое изображение, чтобы вставить GPS и дата информации внутри EXIF, поэтому для этого я использую PIL и piexif; Я использую PIL для извлечения текущего exif и piexif для вставки новых данных в exif изображения;

im = Image.open(image_name_location) 

#load existing exif to use as carrier 
exif_dict = piexif.load(im.info["exif"]) 

#insert new information for gps and date 
exif_dict['GPS']['Latitude']= float(image_gps.split(',')[0]) 
exif_dict['GPS']['Longitude']= float(image_gps.split(',')[1]) 
exif_dict['0th']['Date and time (digitized)']= datetime.datetime.strptime(image_date, '%d/%m/%Y %H:%M').strftime("%Y:%m:%d %H:%M:%S") 

    #convert exif to bytes 
    exif_bytes = piexif.dump(exif_dict) 

    #add to the image 
    piexif.insert(exif_bytes, image_name_location) 

    #close the image from memory 
    im.close() 

Ошибка, что я делаю, и каким-либо образом я пытаюсь получить текущее Dict EXIF, он возвращает NULL;

У кого-нибудь есть идеи? Нужно упомянуть, на существующих изображениях, после того, как они были загружены в html, этот скрипт отлично работает, но по какой-то причине, при создании изображений это не так.

я изменил и добавил этот код, чтобы получить Exif:

try: 
    exif_dict = piexif.load(im.info["exif"]) 

    #insert new information for gps and date 
    exif_dict['GPS']['Latitude']= str(image_gps.split(',')[0]) 
    exif_dict['GPS']['Longitude']= str(image_gps.split(',')[1]) 
    exif_dict['0th']['Date and time (digitized)']= datetime.datetime.strptime(image_date, '%d/%m/%Y %H:%M').strftime("%Y:%m:%d %H:%M:%S") 

    #close the image from memory 
    im.close() 

except: 
    #create clean exif info for new image if none detected 
    zeroth_ifd = {piexif.ImageIFD.Make: "Image maker", 
        piexif.ImageIFD.Software: "software here" 
        } 
    exif_ifd = {piexif.ExifIFD.DateTimeOriginal: datetime.datetime.strptime(image_date, '%d/%m/%Y %H:%M').strftime("%Y:%m:%d %H:%M:%S"), 
       piexif.ExifIFD.DateTimeDigitized: datetime.datetime.now().strftime("%Y:%m:%d %H:%M:%S") 
       } 
    gps_ifd = {piexif.GPSIFD.GPSVersionID: (2, 0, 0, 0), 
       piexif.GPSIFD.GPSAltitudeRef: 1, 
       piexif.GPSIFD.GPSLatitude: float(Fraction(str(image_gps.split(',')[0]))), 
       piexif.GPSIFD.GPSLongitude: float(Fraction(str(image_gps.split(',')[1]))) 
       } 

    exif_dict = {"0th":zeroth_ifd, "Exif":exif_ifd, "GPS":gps_ifd} 

Это решает ошибку NULL, потому что он имеет Exif чистые, если ни один, но теперь я получаю сообщение об ошибке piexif на преобразование GPS данные от поплавка до touple?

+0

теперь после вар дамп Информация об изображении непосредственно это то, что я получаю: – Thanatos11th

+0

'{ "JFIF": 258, "jfif_unit": 0, «прогрессивный»: 1, «progression»: 1, «jfif_version»: [1, 2], «jfif_density»: [1, 1]} ' – Thanatos11th

ответ

3

Окончательное решение, поэтому PILL Image не может найти что-либо в отношении exif, если нет, но библиотека piexif работает как шарм и даже создает пустой exif, если ни один не найден.

добавил этот код, чтобы заменить вычисление EXIF:

  exif_dict = piexif.load(image_name_location) 

      #convert GPS to degree, minutes, seconds for touple 
      latitude_coo = Latitude(image_gps.split(',')[0]).to_string('d% %M% %S% %H').split() 
      longitude_coo = Longitude(image_gps.split(',')[1]).to_string('d% %M% %S% %H').split() 

      gps_ifd = {piexif.GPSIFD.GPSVersionID: (2, 0, 0, 0), 
         piexif.GPSIFD.GPSAltitudeRef: 1, 
         piexif.GPSIFD.GPSLatitude: ((int(latitude_coo[0]),1),(int(float(latitude_coo[1])*100),100),(int(float(latitude_coo[2])*100),100)), 
         piexif.GPSIFD.GPSLatitudeRef: latitude_coo[3], 
         piexif.GPSIFD.GPSLongitude: ((int(longitude_coo[0]),1),(int(float(longitude_coo[2])*100),100),(int(float(longitude_coo[2])*100),100)), 
         piexif.GPSIFD.GPSLongitudeRef: longitude_coo[3] 
         } 

      #insert new information for gps and date 
      exif_dict['Exif'][piexif.ExifIFD.DateTimeOriginal]= datetime.datetime.strptime(image_date, '%d/%m/%Y %H:%M').strftime("%Y:%m:%d %H:%M:%S") 
      exif_dict['Exif'][piexif.ExifIFD.DateTimeDigitized]= datetime.datetime.now().strftime("%Y:%m:%d %H:%M:%S") 
      exif_dict['0th'][piexif.ImageIFD.Make]= "Your test here" 
      exif_dict['0th'][piexif.ImageIFD.Software]= "the software name" 
      exif_dict['0th'][piexif.ImageIFD.DateTime]= datetime.datetime.strptime(image_date, '%d/%m/%Y %H:%M').strftime("%Y:%m:%d %H:%M:%S") 
      exif_dict['GPS'] = gps_ifd 

      #convert exif to bytes 
      exif_bytes = piexif.dump(exif_dict) 

      #add to the image 
      piexif.insert(exif_bytes, image_name_location) 

Также использовал эту библиотеку https://pypi.python.org/pypi/LatLon/1.0.2, чтобы получить coordonates от лат, долгота формата Google в степень, минуты, секунды, ссылка и прикладных Согласно наблюдениям этой книги инструкция по GPS формата Touple: http://www.cipa.jp/std/documents/e/DC-008-2012_E.pdf

это стоило: P

+0

Финал: 1. Первая причина заключалась в том, что изображение PIL не получило exif и разбилось на массив ключ; исправлено заменой PIL get exif на piexif.load (img); – Thanatos11th

+0

2. При сбрасывании exif dict, piexif очень строг, поэтому при некотором преобразовании данных (GPS) он хотел, чтобы gps-координаторы в корме; – Thanatos11th

+0

3. формат привязки для GPSLongitude и GPSLatitude: ((dd, 1), (mmmm/100), (ssss/100)) Ссылка для GPSLatitudeRef и GPSLongitudeRef является строкой для «N»/«S» и «W»/«E» – Thanatos11th