[C#] GeoTag(GPS 정보)를 jpg 파일로 설정/취득할 때의 빠진 메모

모쿠지
h tps:// 퀵했다. 작은 m / 절 1707 / MS / 4f입니다 73D86 그림 d283 그림 C4f

GeoTag 관련
- GeoTag (GPS 정보)를 jpg 파일로 설정 / 취득
- GeoTag(GPS 정보)를 jpg 파일로 설정/취득할 때의 헛된 메모

하고 싶은 일



UWP API ( GeotagHelper.SetGeotagAsync() )를 사용하여 jpeg 파일에 GeoTag를 부여하고 싶지만 특정 jpeg 파일 만 왜인지 GeotagHelper.SetGeotagAsync()를 실행할 때 예외가 발생합니다.


jpeg 파일을 제대로 SetGeotagAsync에 넣어 하고 있을 것인데, 왜 예외가 될지 모르겠다. 그 때에 조사했다(라고 하는지 여러가지 시험했다) 일의 메모.

결론 (예외의 원인)



원인은, GeoTag 부여하려고 하고 있던 jpeg 파일이, 실은 jpeg 파일이 아니었던 것.
구체적으로는, 그 jpeg 파일을 System.Drawing.BitmapSave() 메소드를 사용해 작성하고 있었지만, Save 의 인수에 System.Drawing.Imaging.ImageFormat.Jpeg . 파일 확장명 System.Drawing.Imaging.ImageFormat.Bmp jpeg 파일로 했기 때문에.

Windows에서는 확장명이 .jpeg인 비트맵 파일의 확장자만을 .bmp로 바꾸면 보통 jpeg로 페인트나 다른 앱에서 열리게 되지만, .jpeg , 확장자뿐만 아니라 멋진 .jpg 파일이 아니라면, 한한 받아들이지 않는 것 같습니다.
(EXIF의 데이터를 타는 영역이 bmp 파일의 선두 부분에는 준비되어 있지 않기 때문일지도.)

샘플


var cur = Directory.GetCurrentDirectory();      // exeのあるディレクトリ
var filepath = cur + @"\ginga.bmp";             // 元の画像
var filepath_out_jpg = cur + @"\ginga_out.jpg"; // jpgとして保存する画像
var filepath_out_bmp = cur + @"\ginga_out_fake.jpg"; // 実はbmpだけどjpgとして保存する画像

using (var fs = new FileStream(filepath, FileMode.Open, FileAccess.ReadWrite))
using (var bmp = new System.Drawing.Bitmap(fs))
{
    // 元の画像を、jpgとbmpで保存し分ける
    bmp.Save(filepath_out_jpg, System.Drawing.Imaging.ImageFormat.Jpeg);
    bmp.Save(filepath_out_bmp, System.Drawing.Imaging.ImageFormat.Bmp);
}

// GPS値作成
BasicGeoposition bgps = new BasicGeoposition() { Latitude = 3.0, Longitude = 2.0, Altitude = 1.0 };
// GPS値をGeopointにセット
Geopoint gps = new Geopoint(bgps);

try
{
    // GPS値をjpgファイルに書き込み
    var stjpg = await Windows.Storage.StorageFile.GetFileFromPathAsync(filepath_out_jpg);
    await GeotagHelper.SetGeotagAsync(stjpg, gps);// →こっちは問題なくgeotag付与できる
    var stbmp = await Windows.Storage.StorageFile.GetFileFromPathAsync(filepath_out_bmp);
    await GeotagHelper.SetGeotagAsync(stbmp, gps);// →こっちは、拡張子はjpgだが実はbmpでjpgではないので、geotag付与時に例外発生
}
catch (Exception ex)
{
    Console.WriteLine(ex.Message);
}

좋은 웹페이지 즐겨찾기