Files
NotificationFlyout/src/TheXamlGuy.NotificationFlyout.Common/Extensions/ImageSourceExtensions.cs
T
2021-02-15 12:21:59 +00:00

48 lines
1.6 KiB
C#
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using Microsoft.Windows.Sdk;
using System;
using System.Drawing;
using System.IO;
using System.Threading.Tasks;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Media.Imaging;
namespace TheXamlGuy.NotificationFlyout.Common.Extensions
{
public static class ImageSourceExtensions
{
public static async Task<Icon> ConvertToIconAsync(this ImageSource imageSource, uint dpi)
{
var bitmapImage = (BitmapImage)imageSource;
if (!ExecutionMode.IsRunningWithIdentity())
{
var uri = $"{AppDomain.CurrentDomain.BaseDirectory}{bitmapImage.UriSource}".Replace("ms-appx:///", "").Replace("/", "\\");
using var stream = File.OpenRead(uri);
return ExtractIcon(dpi, stream);
}
else
{
var storageFile = await Windows.Storage.StorageFile.GetFileFromApplicationUriAsync(bitmapImage.UriSource);
using var stream = await storageFile.OpenStreamForReadAsync();
return ExtractIcon(dpi, stream);
}
}
private static Icon ExtractIcon(uint dpi, Stream stream)
{
var bitmap = (Bitmap)Image.FromStream(stream);
var icon = Icon.FromHandle(bitmap.GetHicon());
return new Icon(icon, new Size(PInvoke.GetSystemMetricsForDpi((int)SystemMetricFlag.SM_CXICON, dpi), PInvoke.GetSystemMetricsForDpi((int)SystemMetricFlag.SM_CYICON, dpi)));
}
private enum SystemMetricFlag : int
{
SM_CXICON = 11,
SM_CYICON = 12,
SM_CXSMICON = 49,
SM_CYSMICON = 50
}
}
}