質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.80%

写真のexif情報を書き換えたい

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 255

runa0202

score 4

前提・実現したいこと

写真のexif情報を書き換えたい

発生している問題・エラーメッセージ

このようなエラーが出ました。

UnboundLocalError                         Traceback (most recent call last)
~/Droon/image.py in <module>
     43     exif_dict['GPS'][2] = tuple(map(tuple,a))
     44     exif_dict['GPS'][4] = tuple(map(tuple,b))
---> 45     exif_bytes = piexif.dump(exif_dict)
     46
     47     fnn = 'DJI_'+num+'p.JPG'

/data/kako/anaconda3/lib/python3.7/site-packages/piexif/_dump.py in dump(exif_dict_original)
     72         exif_length = 0
     73     if gps_is:
---> 74         gps_set = _dict_to_bytes(gps_ifd, "GPS", zeroth_length + exif_length)
     75         gps_bytes = b"".join(gps_set)
     76         gps_length = len(gps_bytes)

/data/kako/anaconda3/lib/python3.7/site-packages/piexif/_dump.py in _dict_to_bytes(ifd_dict, ifd, ifd_offset)
    335             length_str, value_str, four_bytes_over = _value_to_bytes(raw_value,
    336                                                                      value_type,
--> 337                                                                      offset)
    338         except ValueError:
    339             raise ValueError(

/data/kako/anaconda3/lib/python3.7/site-packages/piexif/_dump.py in _value_to_bytes(raw_value, value_type, offset)
    245                                 struct.pack(">L", den))
    246         value_str = struct.pack(">I", offset)
--> 247         four_bytes_over = new_value
    248     elif value_type == TYPES.SRational:
    249         if isinstance(raw_value[0], numbers.Integral):

UnboundLocalError: local variable 'new_value' referenced before assignment


コードはこちらです。

import pandas as pd
from fractions import Fraction
import piexif
from PIL import Image
import droon1

df = droon1.df
df1 = df[df['isPhoto'] > 0]

for i in range(2,88+1):
    num = str(i).zfill(4)
    fn = 'DJI_'+num+'.JPG'
    rf = '../Photo/' + fn
    img = Image.open(rf)

    exif_dict = piexif.load(img.info['exif'])

    exif_dict['GPS'][piexif.GPSIFD.GPSAltitude] = (df1.iloc[(i)-1][3],1)

    lat = df1.iloc[(i)-1][0]
    lat_a = int(lat)
    lat_b = int((lat - lat_a)*60)
    lat_c = ((lat - lat_a)*60-lat_b)*60*1000

    lon = df1.iloc[(i)-1][1]
    lon_a = int(lon)
    lon_b = int((lon - lon_a)*60)
    lon_c = ((lon - lon_a)*60-lon_b)*60*1000

    a = np.array(exif_dict['GPS'][2])
    b = np.array(exif_dict['GPS'][4])

    print(a)
    a[0,0] = lat_a
    a[1,0] = lat_b
    a[2,0] = lat_c

    b[0,0] = lon_a
    b[1,0] = lon_b
    b[2,0] = lon_c

    exif_dict['GPS'][2] = tuple(map(tuple,a))
    exif_dict['GPS'][4] = tuple(map(tuple,b))
    exif_bytes = piexif.dump(exif_dict)

    fnn = 'DJI_'+num+'p.JPG'
    rff = '../Photo/' + fnn
    img.save(rff, "jpeg",exif=exif_bytes)

試したこと

df = droon1.df
df1 = df[df['isPhoto'] > 0]
をfor文の中に入れてみました。

floatをintに変えてみました。

import pandas as pd
from fractions import Fraction
import piexif
from PIL import Image
import droon1

df = droon1.df
df1 = df[df['isPhoto'] > 0]

for i in range(2,88+1):
    num = str(i).zfill(4)
    fn = 'DJI_'+num+'.JPG'
    rf = '../Photo/' + fn
    img = Image.open(rf)

    exif_dict = piexif.load(img.info['exif'])

    exif_dict['GPS'][piexif.GPSIFD.GPSAltitude] = (df1.iloc[(i)-1][3],1)

    lat = df1.iloc[(i)-1][0]
    lat_a = int(lat)
    lat_b = int((lat - lat_a)*60)
    lat_c = ((lat - lat_a)*60-lat_b)*60
    lat_c = str(lat_c)
    lat_c = lat_c.replace('.','')
    lat_c = lat_c[:6]
    lat_c = int(lat_c)

    lon = df1.iloc[(i)-1][1]
    lon_a = int(lon)
    lon_b = int((lon - lon_a)*60)
    lon_c = ((lon - lon_a)*60-lon_b)*60
    lon_c = str(lon_c)
    lon_c = lon_c.replace('.','')
    lon_c = lon_c[:6]
    lon_c = int(lon_c)

    a = np.array(exif_dict['GPS'][2])
    b = np.array(exif_dict['GPS'][4])


    a[0,0] = lat_a
    a[1,0] = lat_b
    a[2,0] = lat_c

    b[0,0] = lon_a
    b[1,0] = lon_b
    b[2,0] = lon_c

    exif_dict['GPS'][2] = tuple(map(tuple,a))
    exif_dict['GPS'][4] = tuple(map(tuple,b))
    exif_bytes = piexif.dump(exif_dict)

    fnn = 'DJI_'+num+'p.JPG'
    rff = '../Photo/' + fnn
    img.save(rff, "jpeg",exif=exif_bytes)
コード
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • Luke02561

    2020/06/09 12:42

    エラーの全文を見せてください

    キャンセル

  • runa0202

    2020/06/09 12:44 編集

    UnboundLocalError Traceback (most recent call last)
    ~/Droon/image.py in <module>
    43 exif_dict['GPS'][2] = tuple(map(tuple,a))
    44 exif_dict['GPS'][4] = tuple(map(tuple,b))
    ---> 45 exif_bytes = piexif.dump(exif_dict)
    46
    47 fnn = 'DJI_'+num+'p.JPG'

    /data/kako/anaconda3/lib/python3.7/site-packages/piexif/_dump.py in dump(exif_dict_original)
    72 exif_length = 0
    73 if gps_is:
    ---> 74 gps_set = _dict_to_bytes(gps_ifd, "GPS", zeroth_length + exif_length)
    75 gps_bytes = b"".join(gps_set)
    76 gps_length = len(gps_bytes)

    /data/kako/anaconda3/lib/python3.7/site-packages/piexif/_dump.py in _dict_to_bytes(ifd_dict, ifd, ifd_offset)
    335 length_str, value_str, four_bytes_over = _value_to_bytes(raw_value,
    336 value_type,
    --> 337 offset)
    338 except ValueError:
    339 raise ValueError(

    /data/kako/anaconda3/lib/python3.7/site-packages/piexif/_dump.py in _value_to_bytes(raw_value, value_type, offset)
    245 struct.pack(">L", den))
    246 value_str = struct.pack(">I", offset)
    --> 247 four_bytes_over = new_value
    248 elif value_type == TYPES.SRational:
    249 if isinstance(raw_value[0], numbers.Integral):

    UnboundLocalError: local variable 'new_value' referenced before assignment

    これです。

    キャンセル

  • Luke02561

    2020/06/09 12:46

    質問の方でもお願いします

    キャンセル

回答 1

checkベストアンサー

+1

下記と同じエラーのようです。exif_dictの中にfloat(非整数)が混じっていませんか。

You can't use floats. The numbers for these fields are treated as Rationals, and need to either be integral or a (numerator, denominator) tuple.
UnboundLocalError: local variable 'new_value' referenced before assignment #82

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/06/09 15:10

    全く同じエラーが出ました。

    キャンセル

  • 2020/06/09 15:47

    t_obaraさん > ありがとうございます。

    runa0202さん > 書けるようでしたらexif_dictの中身を質問文に追記されると、よりより回答が集まると思います。

    キャンセル

  • 2020/06/09 16:24

    すみません。見落としていました。
    exif_dict['GPS'][piexif.GPSIFD.GPSAltitude] = (df1.iloc[(i)-1][3],1)
    を、intに変えていませんでした。
    変えたら、上手くいきました。
    みなさん、回答質問頂きありがとうございました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.80%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る