如何輕鬆地將ColorFilter應用於位圖,圖像,無論如何。在Android上,這是一個單行:myDrawable.setColorFilter(Color.GRAY, Mode.SRC_IN);
對於Windows,我只發現巨大的頂級編譯樣本以各種方式操作圖像。這對我的需求太多了。我不想一次操作或類似的每個像素,我只是有一個白色圖標的圖像,我希望這成爲綠色或以編程方式。UWP將ColorFilter應用於BitmapImage
1
A
回答
0
您可以使用新的結構的API也這樣做很容易給任何視覺 - 你可以看到代碼,這在這裏https://github.com/Microsoft/WindowsUIDevLabs/blob/master/Demos/EffectEditor/MainPage.xaml.cs(見色調/色相效果)
0
經過大量的時間花費在MSDN和S/O徘徊,我拼湊了下面的課。它不使用WriteableBitmapEx或Microsoft以外的任何庫。
從技術上講,這個答案只有一種混合模式可用; SRC_ATOP。如果像素不透明(alpha 0),將迭代每個像素並用指定的色調顏色替換顏色值。
正如我見過的許多答案中指出的那樣;這將會非常緩慢,除了應用一次性色彩(即在啓動應用程序時)之外,不建議這樣做。如果顏色不會頻繁變化,您可能希望將結果保存到本地文件,而不是每次都應用色調。
using System;
using System.IO;
using System.Runtime.InteropServices.WindowsRuntime;
using System.Threading.Tasks;
using Windows.Graphics.Imaging;
using Windows.Storage;
using Windows.Storage.Streams;
using Windows.UI;
using Windows.UI.Xaml.Media.Imaging;
namespace Helpers
{
public class ImageManipulationHelper
{
public static async Task<WriteableBitmap> ApplyTint(Uri sourceUri, Color tintColour)
{
WriteableBitmap source = await GetImageFile(sourceUri);
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)
{
// check the pixel is not transparent (BGRA)
if (byteArray[i + 3] != 0)
{
byteArray[i] = tintColour.B; // Blue
byteArray[i + 1] = tintColour.G; // Green
byteArray[i + 2] = tintColour.R; // Red
}
}
}
}
if (byteArray != null)
{
WriteableBitmap destination = await PixelBufferToWriteableBitmap(byteArray, source.PixelWidth, source.PixelHeight);
return destination;
}
return null;
}
private static async Task<WriteableBitmap> GetImageFile(Uri fileUri)
{
StorageFile imageFile = await StorageFile.GetFileFromApplicationUriAsync(fileUri);
WriteableBitmap writeableBitmap = null;
using (IRandomAccessStream imageStream = await imageFile.OpenReadAsync())
{
BitmapDecoder bitmapDecoder = await BitmapDecoder.CreateAsync(imageStream);
BitmapTransform dummyTransform = new BitmapTransform();
PixelDataProvider pixelDataProvider =
await bitmapDecoder.GetPixelDataAsync(BitmapPixelFormat.Bgra8,
BitmapAlphaMode.Premultiplied, dummyTransform,
ExifOrientationMode.RespectExifOrientation,
ColorManagementMode.ColorManageToSRgb);
byte[] pixelData = pixelDataProvider.DetachPixelData();
writeableBitmap = new WriteableBitmap(
(int)bitmapDecoder.OrientedPixelWidth,
(int)bitmapDecoder.OrientedPixelHeight);
using (Stream pixelStream = writeableBitmap.PixelBuffer.AsStream())
{
await pixelStream.WriteAsync(pixelData, 0, pixelData.Length);
}
}
return writeableBitmap;
}
public static async Task PixelBufferToWriteableBitmap(WriteableBitmap wb, byte[] bgra)
{
using (Stream stream = wb.PixelBuffer.AsStream())
{
await stream.WriteAsync(bgra, 0, bgra.Length);
}
}
public static async Task<WriteableBitmap> PixelBufferToWriteableBitmap(byte[] bgra, int width, int height)
{
var wb = new WriteableBitmap(width, height);
await PixelBufferToWriteableBitmap(wb, bgra);
return wb;
}
}
}
編碼快樂^ _^
參考文獻:
相關問題
- 1. 將ColorFilter應用於ImageView與ShapedDrawable
- 2. UWP BitmapImage到Stream
- 3. 將字節轉換爲BitmapImage uwp c#
- 4. 如何將IRandomAccessStreamWithContentType轉換爲BitMapImage UWP?
- 5. UWP背景線上的bitmapimage
- 6. 在圖像上應用colorFilter
- 7. 將揭示效果應用於InkToolbar [UWP]
- 8. UWP - 如何將CharacterSpacing應用於PlaceholderText
- 9. ColorFilter不適用於TextView背景
- 10. 無法在Android中應用colorfilter?
- 11. 將從ByteStream獲取的BitmapImage綁定到UWP上的ImageBrush C#
- 12. 在UWP中將BitmapImage轉換爲byte [],然後在sqlite中插入
- 13. System.Net.FTPWebRequest不適用於uwp應用程序
- 14. Application.Current.MainWindow.Show()用於UWP
- 15. remove ColorFilter /撤消setColorFilter
- 16. 將多個過濾器應用於圖片Lumia SDK UWP
- 17. 在UWP應用
- 18. 在UWP應用
- 19. 用於Windows Phone的BitmapImage的WritableImage
- 20. 如何將活動gaussain模糊效果應用於UWP應用程序?
- 21. 將尺寸UWP應用程序應用於所有手機尺寸
- 22. 如何獲取城域(UWP)中BitmapImage的寬度和高度?
- 23. 從BitmapImage或UWP中的流中獲取IntPtr值
- 24. 將BitmapImage傳遞給UserControl
- 25. Silverlight:將BitmapImage寫入WriteableBitmap
- 26. Android在imageView的一部分上應用colorMatrix colorFilter與蒙版
- 27. 應用Colorfilter後滾動Ninepatch縮放錯誤?
- 28. 一個UWP應用
- 29. 使用RelativePanel爲UWP應用
- 30. TransformedBitmap BitmapImage