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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1332閲覧

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

runa0202

総合スコア6

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/06/09 03:31

編集2020/06/09 05:47

前提・実現したいこと

写真の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

1import pandas as pd 2from fractions import Fraction 3import piexif 4from PIL import Image 5import droon1 6 7df = droon1.df 8df1 = df[df['isPhoto'] > 0] 9 10for i in range(2,88+1): 11 num = str(i).zfill(4) 12 fn = 'DJI_'+num+'.JPG' 13 rf = '../Photo/' + fn 14 img = Image.open(rf) 15 16 exif_dict = piexif.load(img.info['exif']) 17 18 exif_dict['GPS'][piexif.GPSIFD.GPSAltitude] = (df1.iloc[(i)-1][3],1) 19 20 lat = df1.iloc[(i)-1][0] 21 lat_a = int(lat) 22 lat_b = int((lat - lat_a)*60) 23 lat_c = ((lat - lat_a)*60-lat_b)*60*1000 24 25 lon = df1.iloc[(i)-1][1] 26 lon_a = int(lon) 27 lon_b = int((lon - lon_a)*60) 28 lon_c = ((lon - lon_a)*60-lon_b)*60*1000 29 30 a = np.array(exif_dict['GPS'][2]) 31 b = np.array(exif_dict['GPS'][4]) 32 33 print(a) 34 a[0,0] = lat_a 35 a[1,0] = lat_b 36 a[2,0] = lat_c 37 38 b[0,0] = lon_a 39 b[1,0] = lon_b 40 b[2,0] = lon_c 41 42 exif_dict['GPS'][2] = tuple(map(tuple,a)) 43 exif_dict['GPS'][4] = tuple(map(tuple,b)) 44 exif_bytes = piexif.dump(exif_dict) 45 46 fnn = 'DJI_'+num+'p.JPG' 47 rff = '../Photo/' + fnn 48 img.save(rff, "jpeg",exif=exif_bytes)

試したこと

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

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

import

1import pandas as pd 2from fractions import Fraction 3import piexif 4from PIL import Image 5import droon1 6 7df = droon1.df 8df1 = df[df['isPhoto'] > 0] 9 10for i in range(2,88+1): 11 num = str(i).zfill(4) 12 fn = 'DJI_'+num+'.JPG' 13 rf = '../Photo/' + fn 14 img = Image.open(rf) 15 16 exif_dict = piexif.load(img.info['exif']) 17 18 exif_dict['GPS'][piexif.GPSIFD.GPSAltitude] = (df1.iloc[(i)-1][3],1) 19 20 lat = df1.iloc[(i)-1][0] 21 lat_a = int(lat) 22 lat_b = int((lat - lat_a)*60) 23 lat_c = ((lat - lat_a)*60-lat_b)*60 24 lat_c = str(lat_c) 25 lat_c = lat_c.replace('.','') 26 lat_c = lat_c[:6] 27 lat_c = int(lat_c) 28 29 lon = df1.iloc[(i)-1][1] 30 lon_a = int(lon) 31 lon_b = int((lon - lon_a)*60) 32 lon_c = ((lon - lon_a)*60-lon_b)*60 33 lon_c = str(lon_c) 34 lon_c = lon_c.replace('.','') 35 lon_c = lon_c[:6] 36 lon_c = int(lon_c) 37 38 a = np.array(exif_dict['GPS'][2]) 39 b = np.array(exif_dict['GPS'][4]) 40 41 42 a[0,0] = lat_a 43 a[1,0] = lat_b 44 a[2,0] = lat_c 45 46 b[0,0] = lon_a 47 b[1,0] = lon_b 48 b[2,0] = lon_c 49 50 exif_dict['GPS'][2] = tuple(map(tuple,a)) 51 exif_dict['GPS'][4] = tuple(map(tuple,b)) 52 exif_bytes = piexif.dump(exif_dict) 53 54 fnn = 'DJI_'+num+'p.JPG' 55 rff = '../Photo/' + fnn 56 img.save(rff, "jpeg",exif=exif_bytes) 57コード

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Luke02561

2020/06/09 03:42

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

2020/06/09 03:45 編集

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 03:46

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

回答1

0

ベストアンサー

下記と同じエラーのようです。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 04:05

jeanbiego

総合スコア3966

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

runa0202

2020/06/09 05:45

float が混ざっっていたので、int に変えました。 しかし、うまくいきません???? 試したコードを、質問に追加します。
t_obara

2020/06/09 06:07

「うまくいきません」では情報量が不足しています。全く同じ状態なのか、状態が変わったのか、変わったのであれば、変わった状況を提示すべきです。
runa0202

2020/06/09 06:10

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

2020/06/09 06:47

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

2020/06/09 07:24

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問