public static async Task <BitmapImage> ApplyColor(string sourceIm, string folderName) { String fixSourceIm = sourceIm.Replace(@"/", @"\"); StorageFile storageFile = await StorageFile.GetFileFromPathAsync(fixSourceIm); ImageProperties properties = await storageFile.Properties.GetImagePropertiesAsync(); WriteableBitmap source = new WriteableBitmap((int)properties.Width, (int)properties.Height); source.SetSource(await storageFile.OpenAsync(FileAccessMode.Read)); Color replaceBlack = Windows.UI.Color.FromArgb(255, byte.Parse(ModernColor.Substring(0, 2), System.Globalization.NumberStyles.HexNumber), byte.Parse(ModernColor.Substring(2, 2), System.Globalization.NumberStyles.HexNumber), byte.Parse(ModernColor.Substring(4, 2), System.Globalization.NumberStyles.HexNumber)); Color replaceWhite = Windows.UI.Color.FromArgb(255, byte.Parse(ModernAcent.Substring(0, 2), System.Globalization.NumberStyles.HexNumber), byte.Parse(ModernAcent.Substring(2, 2), System.Globalization.NumberStyles.HexNumber), byte.Parse(ModernAcent.Substring(4, 2), System.Globalization.NumberStyles.HexNumber)); byte[] byteArray = null; using (Stream stream = source.PixelBuffer.AsStream()) { long streamLength = stream.Length; byteArray = new byte[streamLength]; await stream.ReadAsync(byteArray, 0, byteArray.Length); if (streamLength > 0) { for (int i = 0; i < streamLength; i += 4) { if (byteArray[i + 3] != 0) { int b = Convert.ToInt32(byteArray[i]); int g = Convert.ToInt32(byteArray[i + 1]); int r = Convert.ToInt32(byteArray[i + 2]); double rB = ((b / 255.0) * replaceBlack.B) + (((255 - b) / 255.0) * replaceWhite.B); double rG = ((g / 255.0) * replaceBlack.G) + (((255 - g) / 255.0) * replaceWhite.G); double rR = ((r / 255.0) * replaceBlack.R) + (((255 - r) / 255.0) * replaceWhite.R); byte blue = Convert.ToByte(rB); byte green = Convert.ToByte(rG); byte red = Convert.ToByte(rR); byteArray[i] = blue; // Blue byteArray[i + 1] = green; // Green byteArray[i + 2] = red; // Red } } } } if (byteArray != null) { WriteableBitmap result = await PixelBufferToWritableBitmap(byteArray, source.PixelWidth, source.PixelHeight); StorageFile image = await WriteableBitmapToStorageFile(result, $"{ModernAcent}-{ModernColor}", folderName); BitmapImage imageSource = await StorageFileToBitmapImage(image); return(imageSource); } return(null); }
public static async Task <BitmapImage> ApplyColor(Uri sourceImage, string fileName, string folderName) { ApplicationDataContainer settings = ApplicationData.Current.LocalSettings; if ((string)settings.Values["UseDynamicAccent"] == "true") { string flatWallpaperAcent = (string)settings.Values[$"{(string)settings.Values["DayOrNight"]}FlatAccent-{(string)settings.Values["ColorIdNumber"]}"]; ModernAcent = flatWallpaperAcent.Replace("#", ""); } else { string flatWallpaperAcent = (string)settings.Values["FlatWallpaperAcent"]; ModernAcent = flatWallpaperAcent.Replace("#", ""); } if ((string)settings.Values["UseDynamicColor"] == "true") { string flatWallpaperAcent = (string)settings.Values[$"{(string)settings.Values["DayOrNight"]}FlatColor-{(string)settings.Values["ColorIdNumber"]}"]; ModernColor = flatWallpaperAcent.Replace("#", ""); } else { string flatWallpaperColor = (string)settings.Values["FlatWallpaperColor"]; ModernColor = flatWallpaperColor.Replace("#", ""); } Color replaceBlack = Windows.UI.Color.FromArgb(255, byte.Parse(ModernColor.Substring(0, 2), System.Globalization.NumberStyles.HexNumber), byte.Parse(ModernColor.Substring(2, 2), System.Globalization.NumberStyles.HexNumber), byte.Parse(ModernColor.Substring(4, 2), System.Globalization.NumberStyles.HexNumber)); Color replaceWhite = Windows.UI.Color.FromArgb(255, byte.Parse(ModernAcent.Substring(0, 2), System.Globalization.NumberStyles.HexNumber), byte.Parse(ModernAcent.Substring(2, 2), System.Globalization.NumberStyles.HexNumber), byte.Parse(ModernAcent.Substring(4, 2), System.Globalization.NumberStyles.HexNumber)); WriteableBitmap source = await GetImageFile(sourceImage); byte[] byteArray = null; using (Stream stream = source.PixelBuffer.AsStream()) { long streamLength = stream.Length; byteArray = new byte[streamLength]; await stream.ReadAsync(byteArray, 0, byteArray.Length); if (streamLength > 0) { for (int i = 0; i < streamLength; i += 4) { if (byteArray[i + 3] != 0) { int b = Convert.ToInt32(byteArray[i]); int g = Convert.ToInt32(byteArray[i + 1]); int r = Convert.ToInt32(byteArray[i + 2]); double rB = ((b / 255.0) * replaceBlack.B) + (((255 - b) / 255.0) * replaceWhite.B); double rG = ((g / 255.0) * replaceBlack.G) + (((255 - g) / 255.0) * replaceWhite.G); double rR = ((r / 255.0) * replaceBlack.R) + (((255 - r) / 255.0) * replaceWhite.R); byte blue = Convert.ToByte(rB); byte green = Convert.ToByte(rG); byte red = Convert.ToByte(rR); byteArray[i] = blue; // Blue byteArray[i + 1] = green; // Green byteArray[i + 2] = red; // Red } } } } if (byteArray != null) { WriteableBitmap result = await PixelBufferToWritableBitmap(byteArray, source.PixelWidth, source.PixelHeight); StorageFile image = await WriteableBitmapToStorageFile(result, fileName, folderName); BitmapImage imageSource = await StorageFileToBitmapImage(image); return(imageSource); } return(null); }