From c8f834f9405810a4182dc518d826edb0b040bbfd Mon Sep 17 00:00:00 2001 From: ClemensF Date: Mon, 17 Jun 2019 18:09:28 +0200 Subject: [PATCH] Version 4.12.2 Improved GroundOverlayPanel --- MapControl/UWP/ImageLoader.UWP.cs | 2 ++ MapControl/WPF/ImageLoader.WPF.cs | 2 ++ MapImages/Shared/GroundOverlayPanel.cs | 4 ++-- MapImages/UWP/GroundOverlayPanel.UWP.cs | 10 +++++----- MapImages/WPF/GroundOverlayPanel.WPF.cs | 25 ++++++++++++++++++------- 5 files changed, 29 insertions(+), 14 deletions(-) diff --git a/MapControl/UWP/ImageLoader.UWP.cs b/MapControl/UWP/ImageLoader.UWP.cs index 80255757..1a3a862b 100644 --- a/MapControl/UWP/ImageLoader.UWP.cs +++ b/MapControl/UWP/ImageLoader.UWP.cs @@ -21,7 +21,9 @@ namespace MapControl public static async Task LoadImageAsync(IRandomAccessStream stream) { var image = new BitmapImage(); + await image.SetSourceAsync(stream); + return image; } diff --git a/MapControl/WPF/ImageLoader.WPF.cs b/MapControl/WPF/ImageLoader.WPF.cs index d2128560..28573194 100644 --- a/MapControl/WPF/ImageLoader.WPF.cs +++ b/MapControl/WPF/ImageLoader.WPF.cs @@ -20,11 +20,13 @@ namespace MapControl public static ImageSource LoadImage(Stream stream) { var bitmapImage = new BitmapImage(); + bitmapImage.BeginInit(); bitmapImage.CacheOption = BitmapCacheOption.OnLoad; bitmapImage.StreamSource = stream; bitmapImage.EndInit(); bitmapImage.Freeze(); + return bitmapImage; } diff --git a/MapImages/Shared/GroundOverlayPanel.cs b/MapImages/Shared/GroundOverlayPanel.cs index d892a673..f447b382 100644 --- a/MapImages/Shared/GroundOverlayPanel.cs +++ b/MapImages/Shared/GroundOverlayPanel.cs @@ -71,11 +71,11 @@ namespace MapControl.Images var ext = Path.GetExtension(path).ToLower(); if (ext == ".kmz") { - imageOverlays = await ReadGroundOverlaysFromArchive(path); + imageOverlays = await ReadGroundOverlaysFromArchiveAsync(path); } else if (ext == ".kml") { - imageOverlays = await ReadGroundOverlaysFromFile(path); + imageOverlays = await ReadGroundOverlaysFromFileAsync(path); } } catch (Exception ex) diff --git a/MapImages/UWP/GroundOverlayPanel.UWP.cs b/MapImages/UWP/GroundOverlayPanel.UWP.cs index 17bb4ef1..690e1051 100644 --- a/MapImages/UWP/GroundOverlayPanel.UWP.cs +++ b/MapImages/UWP/GroundOverlayPanel.UWP.cs @@ -20,7 +20,7 @@ namespace MapControl.Images UseLayoutRounding = false; } - private async Task> ReadGroundOverlaysFromFile(string docFile) + private async Task> ReadGroundOverlaysFromFileAsync(string docFile) { docFile = Path.GetFullPath(docFile); @@ -32,7 +32,7 @@ namespace MapControl.Images kmlDocument.Load(stream.AsStreamForRead()); } - var imageOverlays = ReadGroundOverlays(kmlDocument).ToList(); + var imageOverlays = await Task.Run(() => ReadGroundOverlays(kmlDocument).ToList()); var docUri = new Uri(docFile); foreach (var imageOverlay in imageOverlays) @@ -43,7 +43,7 @@ namespace MapControl.Images return imageOverlays; } - private async Task> ReadGroundOverlaysFromArchive(string archiveFile) + private async Task> ReadGroundOverlaysFromArchiveAsync(string archiveFile) { using (var archive = ZipFile.OpenRead(archiveFile)) { @@ -62,7 +62,7 @@ namespace MapControl.Images kmlDocument.Load(docStream); } - var imageOverlays = ReadGroundOverlays(kmlDocument).ToList(); + var imageOverlays = await Task.Run(() => ReadGroundOverlays(kmlDocument).ToList()); foreach (var imageOverlay in imageOverlays) { @@ -74,7 +74,7 @@ namespace MapControl.Images using (var memoryStream = new MemoryStream()) { await zipStream.CopyToAsync(memoryStream); - memoryStream.Position = 0; + memoryStream.Seek(0, SeekOrigin.Begin); imageOverlay.ImageSource = await ImageLoader.LoadImageAsync(memoryStream.AsRandomAccessStream()); } } diff --git a/MapImages/WPF/GroundOverlayPanel.WPF.cs b/MapImages/WPF/GroundOverlayPanel.WPF.cs index 9c150546..0b71bdec 100644 --- a/MapImages/WPF/GroundOverlayPanel.WPF.cs +++ b/MapImages/WPF/GroundOverlayPanel.WPF.cs @@ -14,7 +14,17 @@ namespace MapControl.Images { public partial class GroundOverlayPanel { - private async Task> ReadGroundOverlaysFromFile(string docFile) + private Task> ReadGroundOverlaysFromFileAsync(string docFile) + { + return Task.Run(() => ReadGroundOverlaysFromFile(docFile)); + } + + private Task> ReadGroundOverlaysFromArchiveAsync(string archiveFile) + { + return Task.Run(() => ReadGroundOverlaysFromArchive(archiveFile)); + } + + private List ReadGroundOverlaysFromFile(string docFile) { docFile = Path.GetFullPath(docFile); @@ -22,17 +32,18 @@ namespace MapControl.Images kmlDocument.Load(docFile); var imageOverlays = ReadGroundOverlays(kmlDocument).ToList(); - var docUri = new Uri(docFile); + var docDir = Path.GetDirectoryName(docFile); foreach (var imageOverlay in imageOverlays) { - imageOverlay.ImageSource = await ImageLoader.LoadImageAsync(new Uri(docUri, imageOverlay.ImagePath)); + imageOverlay.ImageSource = ImageLoader.LoadImage(Path.Combine(docDir, imageOverlay.ImagePath)); } return imageOverlays; + } - private async Task> ReadGroundOverlaysFromArchive(string archiveFile) + private List ReadGroundOverlaysFromArchive(string archiveFile) { using (var archive = ZipFile.OpenRead(archiveFile)) { @@ -62,9 +73,9 @@ namespace MapControl.Images using (var zipStream = imageEntry.Open()) using (var memoryStream = new MemoryStream()) { - await zipStream.CopyToAsync(memoryStream); - memoryStream.Position = 0; - imageOverlay.ImageSource = await ImageLoader.LoadImageAsync(memoryStream); + zipStream.CopyTo(memoryStream); + memoryStream.Seek(0, SeekOrigin.Begin); + imageOverlay.ImageSource = ImageLoader.LoadImage(memoryStream); } } }