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

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

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

Exifは、デジタルカメラで撮影した画像データに、撮影時の状況などさまざまな情報(メタデータ)を添付して保存する画像ファイル形式の規格です。この付加情報により、データ管理や機器同士のデータ交換、最適な設定の出力などを行うことができます。

GPS

GPSは、Global Positioning Systemの略です。衛星信号を使用して受信機の地上又は空中内の居場所を特定するナビゲーションシステムです。"GPS"は受信機のことも指します。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

1回答

1453閲覧

c#でJPGにGPSタグを追加する方法

nezumi35

総合スコア1

exif

Exifは、デジタルカメラで撮影した画像データに、撮影時の状況などさまざまな情報(メタデータ)を添付して保存する画像ファイル形式の規格です。この付加情報により、データ管理や機器同士のデータ交換、最適な設定の出力などを行うことができます。

GPS

GPSは、Global Positioning Systemの略です。衛星信号を使用して受信機の地上又は空中内の居場所を特定するナビゲーションシステムです。"GPS"は受信機のことも指します。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

1グッド

1クリップ

投稿2022/04/01 14:02

前提

c#でoozcitak/exiflibraryを使ってJPGにGPSの座標情報を追加しようとしていますがその方法がわかりません
oozcitak/exiflibrary(nugetでExifLibNetで出てくるライブラリ)
https://github.com/oozcitak/exiflibrary/blob/master/README.md#

実現したいこと

GPS座標をdouble型で(+35.31245,+139.31245)のように持っていますがその情報を画像に入れたいと思っています。
試したことで使用している方法を使えば10進数を60進数に変換してから入れられそうですが、なにか綺麗な形で直接10進数から入れる方法はないでしょうか。

double lat = +35.31245; double lon = +139.31245

試したこと

試行錯誤しながら以下の方法では座標が入れられました。
しかし、10進数の状態から直接座標を入れたいと思っています。

using ExifLibrary; string picPath = @"C:\test\test.JPG"; ImageFile file = ImageFile.FromFile(picPath); file.Properties.Set(ExifTag.GPSLatitudeRef, GPSLatitudeRef.North); file.Properties.Set(ExifTag.GPSLatitude,(float)35,(float)44,(float)6.32); file.Properties.Set(ExifTag.GPSLongitudeRef,GPSLongitudeRef.East ); file.Properties.Set(ExifTag.GPSLongitude, (float)139, (float)17, (float)0.91); file.Save(picPath );
TN8001👍を押しています

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

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

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

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

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

y_waiwai

2022/04/02 00:23

10進数を60進数に変換するという計算式はどういうものでしょうか
nezumi35

2022/04/02 00:57

60進数は角度を度分秒で表した形式で 緯度: 35° 18′ 44.819″ 経度: 139° 18′ 44.820″ のような形式です 10進数はこれを小数で表示した形式で 緯度 : 35.31245 経度 : 139.31245 の形式です。 https://d-and-i.hatenablog.com/entry/2016/09/12/090000 などの変換式を参考にして 事前に35.31245を35° 18′ 44.819″に変換して file.Properties.Set(ExifTag.GPSLatitude,(float)35,(float)44,(float) 44.819); のようにすれば値の設定はできるのですが、 このライブラリの関数を使って引数1個で値の設定ができないかと思った次第です。 よろしくお願いいたします。
guest

回答1

0

ベストアンサー

試したことで使用している方法を使えば10進数を60進数に変換してから入れられそうですが、なにか綺麗な形で直接10進数から入れる方法はないでしょうか。

拡張メソッドを作ったらどうですか。

cs

1using ExifLibrary; 2 3var picPath = @"test.jpg"; 4var file = ImageFile.FromFile(picPath); 5 6file.Properties.SetGPSLatitudeLongitude(33.852942, 130.75496); 7file.Save(picPath); 8 9static class Extensions 10{ 11 public static void SetGPSLatitudeLongitude(this ExifPropertyCollection<ExifProperty> properties, double latitude, double longitude) 12 { 13 SetGPSLatitude(properties, latitude); 14 SetGPSLongitude(properties, longitude); 15 } 16 17 public static void SetGPSLatitude(this ExifPropertyCollection<ExifProperty> properties, double latitude) 18 { 19 properties.Set(ExifTag.GPSLatitudeRef, 0 <= latitude ? GPSLatitudeRef.North : GPSLatitudeRef.South); 20 21 var (d, m, s) = GetDMS(latitude); 22 properties.Set(ExifTag.GPSLatitude, d, m, (float)s); 23 } 24 25 public static void SetGPSLongitude(this ExifPropertyCollection<ExifProperty> properties, double longitude) 26 { 27 properties.Set(ExifTag.GPSLongitudeRef, 0 <= longitude ? GPSLongitudeRef.East : GPSLongitudeRef.West); 28 29 var (d, m, s) = GetDMS(longitude); 30 properties.Set(ExifTag.GPSLongitude, d, m, (float)s); 31 } 32 33 private static (int Degrees, int Minutes, double Seconds) GetDMS(double coordinate) 34 { 35 coordinate = Math.Abs(coordinate); 36 var d = (int)coordinate; 37 var m = (int)((coordinate - d) * 60); 38 var s = ((coordinate - d - (m / 60d)) * 3600); 39 return (d, m, s); 40 } 41}

変換は提示リンクをそのままうつしたつもりですが、微妙に小数点以下が合わない気がします。
なんでかはわかりません^^;

投稿2022/04/02 08:35

編集2023/07/30 05:35
TN8001

総合スコア9242

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

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

nezumi35

2022/04/02 14:44

ありがとうございます! プログラミング初心者で拡張メソッドを知ることができました。 すっきり解決できて良かったです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問