[英]What is the best way to output Bitmap in a window (WPF)?
我想做的事:
給定一個簡單的 Bitmap (System.Drawing.Bitmap) 我願意 output 將它添加到我的 window 應用程序中。 我也願意經常做,創建一個框架stream。
我用過的:
首先,我一直在將 Bitmap 轉換為 BitmapImage,然后將其分配給 Image 控件的 Source 字段。
這種方法的問題在於轉換本身。 它很慢。 我還沒有找到一種運行速度足夠快的方法,對於 640x480 Bitmap,最好的方法大約需要 20 毫秒,這很慢。 我希望找到一種方法可以在不到 5 毫秒的時間內完成任何常見的解決方案或解決整個問題的不同方法。 也許,除了 Image 之外,還有一個不同的控件可以與純 Bitmap 一起使用,我不需要轉換。 我也沒有使用 WPF,UWP 或新的 WinUI 3 有這個問題嗎? 我檢查了 UWP 使用 WriteableBitmap,這也需要轉換,但也許還有不同的方法?
我發現了各種轉換,其中一些很慢,而其中一些由於某種原因只會產生白色圖像。 我在下面提供了一個列表(我嘗試了更多,但我不記得具體是什么了):
方法( 來源):
public BitmapImage ToBitmapImage(Bitmap bitmap)
{
using (MemoryStream memory = new MemoryStream())
{
bitmap.Save(memory, ImageFormat.Png);
memory.Position = 0;
BitmapImage bitmapImage = new BitmapImage();
bitmapImage.BeginInit();
bitmapImage.StreamSource = memory;
bitmapImage.CacheOption = BitmapCacheOption.OnLoad;
bitmapImage.EndInit();
bitmapImage.Freeze();
return bitmapImage;
}
}
使用 Asmak9.EssentialToolKit 庫( source ),但轉換大約需要 27 毫秒,所以這不是一個選擇。
使用下面的方法。 由於某種奇怪的原因,這個對我不起作用。 它運行沒有問題,但轉換的結果是一個空白(白色)圖像,而不是輸入其中的東西。
方法( 來源):
private BitmapSource Convert(Bitmap bmp)
{
var bitmapData = bmp.LockBits(
new System.Drawing.Rectangle(0, 0, bmp.Width, bmp.Height),
System.Drawing.Imaging.ImageLockMode.ReadOnly, bmp.PixelFormat);
var bitmapSource = BitmapSource.Create(
bitmapData.Width, bitmapData.Height,
bitmap.HorizontalResolution, bitmap.VerticalResolution,
PixelFormats.Bgr24, null,
bitmapData.Scan0, bitmapData.Stride * bitmapData.Height, bitmapData.Stride);
bmp.UnlockBits(bitmapData);
return bitmapSource;
}
方法( 來源):
[System.Runtime.InteropServices.DllImport("gdi32.dll")]
public static extern bool DeleteObject(IntPtr hObject);
private BitmapSource Bitmap2BitmapImage(Bitmap bitmap)
{
IntPtr hBitmap = bitmap.GetHbitmap();
BitmapSource retval;
try
{
retval = Imaging.CreateBitmapSourceFromHBitmap(
hBitmap,
IntPtr.Zero,
Int32Rect.Empty,
BitmapSizeOptions.FromEmptyOptions());
}
finally
{
DeleteObject(hBitmap);
}
return retval;
}
也許,最后 2 次轉換更好,但它們沒有正確轉換,或者我做錯了什么? 還是有更好的方法來放棄轉換步驟並直接顯示 Bitmap?
正如 Clement 上面指出的,方法 3 是最快的,但它需要兩件事:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.