diff --git a/MapControl/Shared/ImageLoader.cs b/MapControl/Shared/ImageLoader.cs index a6574ca8..4d7b8e50 100644 --- a/MapControl/Shared/ImageLoader.cs +++ b/MapControl/Shared/ImageLoader.cs @@ -5,6 +5,7 @@ using System; using System.Collections.Generic; using System.Diagnostics; +using System.IO; using System.Linq; using System.Net.Http; using System.Threading.Tasks; @@ -65,6 +66,14 @@ namespace MapControl return image; } + public static async Task LoadImageAsync(byte[] buffer) + { + using (var stream = new MemoryStream(buffer)) + { + return await LoadImageAsync(stream); + } + } + internal class HttpResponse { public byte[] Buffer { get; } diff --git a/MapControl/WPF/ImageLoader.WPF.cs b/MapControl/WPF/ImageLoader.WPF.cs index 4f49ec1b..e5d4e397 100644 --- a/MapControl/WPF/ImageLoader.WPF.cs +++ b/MapControl/WPF/ImageLoader.WPF.cs @@ -5,6 +5,7 @@ using System; using System.IO; using System.Threading.Tasks; +using System.Windows; using System.Windows.Media; using System.Windows.Media.Imaging; @@ -12,20 +13,22 @@ namespace MapControl { public static partial class ImageLoader { - public static Task LoadImageAsync(Stream stream) + public static ImageSource LoadImage(Stream stream) { - return Task.Run(() => LoadImage(stream)); + var image = new BitmapImage(); + + image.BeginInit(); + image.CacheOption = BitmapCacheOption.OnLoad; + image.StreamSource = stream; + image.EndInit(); + image.Freeze(); + + return image; } - public static Task LoadImageAsync(byte[] buffer) + public static Task LoadImageAsync(Stream stream) { - return Task.Run(() => - { - using (var stream = new MemoryStream(buffer)) - { - return LoadImage(stream); - } - }); + return Task.FromResult(LoadImage(stream)); } public static Task LoadImageAsync(string path) @@ -44,22 +47,9 @@ namespace MapControl }); } - private static ImageSource LoadImage(Stream stream) - { - var bitmapImage = new BitmapImage(); - - bitmapImage.BeginInit(); - bitmapImage.CacheOption = BitmapCacheOption.OnLoad; - bitmapImage.StreamSource = stream; - bitmapImage.EndInit(); - bitmapImage.Freeze(); - - return bitmapImage; - } - internal static async Task LoadMergedImageAsync(Uri uri1, Uri uri2, IProgress progress) { - ImageSource image = null; + WriteableBitmap image = null; IProgress progress1 = null; IProgress progress2 = null; @@ -81,25 +71,21 @@ namespace MapControl image1.Format.BitsPerPixel % 8 == 0) { var format = image1.Format; - var width = image1.PixelWidth + image2.PixelWidth; var height = image1.PixelHeight; - var stride1 = image1.PixelWidth * format.BitsPerPixel / 8; - var stride2 = image2.PixelWidth * format.BitsPerPixel / 8; + var width1 = image1.PixelWidth; + var width2 = image2.PixelWidth; + var stride1 = width1 * format.BitsPerPixel / 8; + var stride2 = width2 * format.BitsPerPixel / 8; var buffer1 = new byte[stride1 * height]; var buffer2 = new byte[stride2 * height]; - var stride = stride1 + stride2; - var buffer = new byte[stride * height]; image1.CopyPixels(buffer1, stride1, 0); image2.CopyPixels(buffer2, stride2, 0); - for (var i = 0; i < height; i++) - { - Array.Copy(buffer1, i * stride1, buffer, i * stride, stride1); - Array.Copy(buffer2, i * stride2, buffer, i * stride + stride1, stride2); - } - - image = BitmapSource.Create(width, height, 96, 96, format, null, buffer, stride); + image = new WriteableBitmap(width1 + width2, height, 96, 96, format, null); + image.WritePixels(new Int32Rect(0, 0, width1, height), buffer1, stride1, 0); + image.WritePixels(new Int32Rect(width1, 0, width2, height), buffer2, stride2, 0); + image.Freeze(); } return image; diff --git a/MapControl/WinUI/ImageLoader.WinUI.cs b/MapControl/WinUI/ImageLoader.WinUI.cs index 694b28ff..411198ab 100644 --- a/MapControl/WinUI/ImageLoader.WinUI.cs +++ b/MapControl/WinUI/ImageLoader.WinUI.cs @@ -51,14 +51,6 @@ namespace MapControl return LoadImageAsync(stream.AsRandomAccessStream()); } - public static async Task LoadImageAsync(byte[] buffer) - { - using (var stream = new MemoryStream(buffer)) - { - return await LoadImageAsync(stream); - } - } - public static async Task LoadImageAsync(string path) { ImageSource image = null;