diff --git a/src/LacmusApp.Avalonia/LacmusApp.Avalonia.csproj b/src/LacmusApp.Avalonia/LacmusApp.Avalonia.csproj index 20ce762..f1cf204 100755 --- a/src/LacmusApp.Avalonia/LacmusApp.Avalonia.csproj +++ b/src/LacmusApp.Avalonia/LacmusApp.Avalonia.csproj @@ -1,7 +1,7 @@ Exe - net6.0 + net8.0 linux-x64;win-x64;osx-x64 Lacmus Foundation 1.0.0 @@ -64,7 +64,7 @@ - + @@ -76,12 +76,12 @@ - - - - - - + + + + + + diff --git a/src/LacmusApp.Avalonia/Services/PhotoLoader.cs b/src/LacmusApp.Avalonia/Services/PhotoLoader.cs index 3fd00d1..a42c910 100755 --- a/src/LacmusApp.Avalonia/Services/PhotoLoader.cs +++ b/src/LacmusApp.Avalonia/Services/PhotoLoader.cs @@ -51,7 +51,7 @@ public async Task ReadAllFromDirByPhoto(LoadType loadType = Lo using (var stream = File.OpenRead(path)) { var (brush, height, width) = await reader.Read(stream); - var (metadata, latitude, longitude) = ExifConvertor.ConvertExif( + var (metadata, latitude, longitude, altitude) = ExifConvertor.ConvertExif( ImageMetadataReader.ReadMetadata(path)); var photoViewModel = new PhotoViewModel(index) { @@ -63,6 +63,7 @@ public async Task ReadAllFromDirByPhoto(LoadType loadType = Lo Name = GetNameFromPath(path), Latitude = latitude, Longitude = longitude, + Altitude = altitude, ExifDataCollection = metadata }; photoList.Add(photoViewModel); @@ -109,7 +110,7 @@ public async Task ReadAllFromDirByAnnotation(LoadType loadType using (var photoStream = File.OpenRead(photoPath)) { var (brush, height, width) = await reader.Read(photoStream); - var (metadata, latitude, longitude) = ExifConvertor.ConvertExif( + var (metadata, latitude, longitude, altitude) = ExifConvertor.ConvertExif( ImageMetadataReader.ReadMetadata(photoPath)); var photoViewModel = new PhotoViewModel(index) { @@ -121,6 +122,7 @@ public async Task ReadAllFromDirByAnnotation(LoadType loadType Name = GetNameFromPath(photoPath), Latitude = latitude, Longitude = longitude, + Altitude = altitude, ExifDataCollection = metadata }; photoList.Add(photoViewModel); @@ -147,7 +149,7 @@ public async Task LoadFromFile(string path, int index, IEnumerab using (var photoStream = File.OpenRead(path)) { var (brush, height, width) = await reader.ReadFromStream(photoStream); - var (metadata, latitude, longitude) = ExifConvertor.ConvertExif( + var (metadata, latitude, longitude, altitude) = ExifConvertor.ConvertExif( ImageMetadataReader.ReadMetadata(path)); return new PhotoViewModel(index) { @@ -159,6 +161,7 @@ public async Task LoadFromFile(string path, int index, IEnumerab Name = GetNameFromPath(path), Latitude = latitude, Longitude = longitude, + Altitude = altitude, ExifDataCollection = metadata }; } diff --git a/src/LacmusApp.Avalonia/ViewModels/FourthWizardViewModel.cs b/src/LacmusApp.Avalonia/ViewModels/FourthWizardViewModel.cs index 3ee0af4..6906942 100755 --- a/src/LacmusApp.Avalonia/ViewModels/FourthWizardViewModel.cs +++ b/src/LacmusApp.Avalonia/ViewModels/FourthWizardViewModel.cs @@ -85,7 +85,7 @@ public async Task OpenFile(string inputPath) await using (var stream = File.OpenRead(path)) { var (brush, height, width) = await reader.Read(stream); - var (metadata, latitude, longitude) = ExifConvertor.ConvertExif( + var (metadata, latitude, longitude, altitude) = ExifConvertor.ConvertExif( ImageMetadataReader.ReadMetadata(path)); var photoViewModel = new PhotoViewModel(id) { @@ -96,6 +96,7 @@ public async Task OpenFile(string inputPath) Path = path, Latitude = latitude, Longitude = longitude, + Altitude = altitude, ExifDataCollection = metadata }; diff --git a/src/LacmusApp.Avalonia/ViewModels/MetadataViewModel.cs b/src/LacmusApp.Avalonia/ViewModels/MetadataViewModel.cs index 27dd50c..73b24c8 100755 --- a/src/LacmusApp.Avalonia/ViewModels/MetadataViewModel.cs +++ b/src/LacmusApp.Avalonia/ViewModels/MetadataViewModel.cs @@ -29,12 +29,14 @@ public class MetadataViewModel : ReactiveValidationObject public ReadOnlyObservableCollection MetaDataCollection => _metaDataCollection; [Reactive] public string Latitude { get; set; } = "N/A"; [Reactive] public string Longitude { get; set; } = "N/A"; + [Reactive] public string Altitude { get; set; } = "N/A"; [Reactive] public ImageBrush QrImage { get; set; } [Reactive] public LocalizationContext LocalizationContext { get; set; } public MetadataViewModel(Window window, PhotoViewModel photoViewModel, LocalizationContext localizationContext) { Latitude = $"{photoViewModel.Latitude}"; Longitude = $"{photoViewModel.Longitude}"; + Altitude = $"{photoViewModel.Altitude} m"; _metaDataList.AddRange(photoViewModel.ExifDataCollection); @@ -53,6 +55,10 @@ public MetadataViewModel(Window window, PhotoViewModel photoViewModel, Localizat viewModel => viewModel.Longitude, x => x != "N/A", path => $"Cannot parse gps longitude"); + this.ValidationRule( + viewModel => viewModel.Altitude, + x => x != "N/A", + path => $"Cannot parse gps altitude"); OpenYandexCommand = ReactiveCommand.Create(OpenYandex, this.IsValid()); OpenGoogleCommand = ReactiveCommand.Create(OpenGoogle, this.IsValid()); @@ -82,30 +88,6 @@ public void OpenOSM() $"#map=15/{Latitude.Replace(',', '.')}/{Longitude.Replace(',', '.')}"); } - private string TranslateGeoTag(string tag) - { - try - { - if (!tag.Contains('°')) - return tag; - tag = tag.Replace('°', ';'); - tag = tag.Replace('\'', ';'); - tag = tag.Replace('"', ';'); - tag = tag.Replace(" ", ""); - - var splitTag = tag.Split(';'); - var grad = float.Parse(splitTag[0]); - var min = float.Parse(splitTag[1]); - var sec = float.Parse(splitTag[2]); - - var result = grad + min / 60 + sec / 3600; - return $"{result}"; - } - catch - { - return "N/A"; - } - } private void OpenUrl(string url) { try @@ -134,6 +116,7 @@ private void OpenUrl(string url) } } + [Obsolete("Obsolete")] private void RenderQr() { using (var generator = new QRCodeGenerator()) diff --git a/src/LacmusApp.Avalonia/Views/MetadataWindow.xaml b/src/LacmusApp.Avalonia/Views/MetadataWindow.xaml index 0b16e62..78d22d0 100755 --- a/src/LacmusApp.Avalonia/Views/MetadataWindow.xaml +++ b/src/LacmusApp.Avalonia/Views/MetadataWindow.xaml @@ -45,6 +45,11 @@ + + + + + ExifDataCollection { get; set; } public TBrush Brush { get; set; } public string Path { get; set; } diff --git a/src/LacmusApp/Image/Services/ExifConvertor.cs b/src/LacmusApp/Image/Services/ExifConvertor.cs index f261929..c348da3 100644 --- a/src/LacmusApp/Image/Services/ExifConvertor.cs +++ b/src/LacmusApp/Image/Services/ExifConvertor.cs @@ -1,5 +1,7 @@ using System; using System.Collections.Generic; +using System.Linq; +using System.Text.RegularExpressions; using LacmusApp.Image.Models; using MetadataExtractor; using Serilog; @@ -8,11 +10,12 @@ namespace LacmusApp.Image.Services { public static class ExifConvertor { - public static (IEnumerable, float, float) ConvertExif(IReadOnlyList directories) + public static (IEnumerable, float, float, float) ConvertExif(IReadOnlyList directories) { var list = new List(); var latitude = 0f; var longitude = 0f; + var altitude = 0f; foreach (var directory in directories) { @@ -22,6 +25,8 @@ public static (IEnumerable, float, float) ConvertExif(IReadOnlyList, float, float) ConvertExif(IReadOnlyList> LoadFromFile(string path) await using (var stream = File.OpenRead(path)) { - var (metadata, latitude, longitude) = ExifConvertor.ConvertExif( + var (metadata, latitude, longitude, altitude) = ExifConvertor.ConvertExif( ImageMetadataReader.ReadMetadata(stream)); var (imageBrush, width, height) = await _brushReader.Read(stream); @@ -43,6 +43,7 @@ public async Task> LoadFromFile(string path) IsWatched = false, Latitude = latitude, Longitude = longitude, + Altitude = altitude, Path = path }; } diff --git a/src/LacmusApp/LacmusApp.csproj b/src/LacmusApp/LacmusApp.csproj index e78760b..ec2c31b 100644 --- a/src/LacmusApp/LacmusApp.csproj +++ b/src/LacmusApp/LacmusApp.csproj @@ -1,13 +1,13 @@ - net6.0 + net8.0 - + diff --git a/src/LacmusApp/Screens/ViewModels/AboutViewModel.cs b/src/LacmusApp/Screens/ViewModels/AboutViewModel.cs index 5e54b08..ffd566a 100644 --- a/src/LacmusApp/Screens/ViewModels/AboutViewModel.cs +++ b/src/LacmusApp/Screens/ViewModels/AboutViewModel.cs @@ -22,7 +22,7 @@ public AboutViewModel(IVersionViewModel versionViewModel) }); OpenSiteCommand = ReactiveCommand.Create(() => { - manager.OpenLink("https://lacmus-foundation.github.io/"); + manager.OpenLink("https://lacmus.ml/"); }); }