将位图显示为图像

本文关键字:图像 显示 位图 | 更新日期: 2023-09-27 18:14:54

我有qrcode生成器(我使用ZXing.QrCode)

public Bitmap GenerateQR(int width, int height, string text)
    {
        var bw = new ZXing.BarcodeWriter();
        var encOptions = new ZXing.Common.EncodingOptions() { Width = width, Height = height, Margin = 0 };
        bw.Options = encOptions;
        bw.Format = ZXing.BarcodeFormat.QR_CODE;
        var result = new Bitmap(bw.Write(text));
        return result;
    }

现在我想在新窗口中显示qr码,所以我调用:

var window = new Zeszycik.View.show(GenerateQR(300,300,"some txt")); 
window.Show();

但是我不知道如何在新窗口显示qrcode

public show(Bitmap qrcode)
    {
        InitializeComponent();
        print(qrcode);
    }
    private void print(Bitmap img)
    {
       image.Source = img; //error
    }

将位图显示为图像

图像源属性的类型是 ImageSource ,但 Bitmap 不派生自ImageSource,所以你需要将其转换为ImageSource的一个实例,可以是 BitmapImage BitmapSource

现在,要将Bitmap转换为BitmapSource,您可以参考此链接在这里。为了回答的完整性,我将从这里的链接发布答案:

[System.Runtime.InteropServices.DllImport("gdi32.dll")]
public static extern bool DeleteObject(IntPtr hObject);
private BitmapSource Bitmap2BitmapSource(Bitmap bitmap)
{
    IntPtr hBitmap = bitmap.GetHbitMap();
    BitmapSource retval;
    try
    {
        retval = Imaging.CreateBitmapSourceFromHBitmap(
                     hBitmap,
                     IntPtr.Zero,
                     Int32Rect.Empty,
                     BitmapSizeOptions.FromEmptyOptions());
    }
    finally
    {
        DeleteObject(hBitmap); //Necessary to avoid memory leak.
    }
    return retval;
}

现在你可以像这样设置图片来源:

image.Source = Bitmap2BitmapSource(img);