一尘不染

将BitmapImage转换为Bitmap,反之亦然

c#

我在C#中有BitmapImage。我需要对图像进行操作。例如灰度,在图像上添加文本等。

我在stackoverflow中找到了用于灰度的函数,该函数接受位图并返回位图。

所以我需要将BitmapImage转换为Bitmap,进行操作并转换回去。

我怎样才能做到这一点?这是最好的方法吗?


阅读 271

收藏
2020-05-19

共1个答案

一尘不染

无需使用外部库。

将BitmapImage转换为Bitmap:

private Bitmap BitmapImage2Bitmap(BitmapImage bitmapImage)
{
    // BitmapImage bitmapImage = new BitmapImage(new Uri("../Images/test.png", UriKind.Relative));

    using(MemoryStream outStream = new MemoryStream())
    {
        BitmapEncoder enc = new BmpBitmapEncoder();
        enc.Frames.Add(BitmapFrame.Create(bitmapImage));
        enc.Save(outStream);
        System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(outStream);

        return new Bitmap(bitmap);
    }
}

要将位图转换回BitmapImage:

[System.Runtime.InteropServices.DllImport("gdi32.dll")]
public static extern bool DeleteObject(IntPtr hObject);

private BitmapImage Bitmap2BitmapImage(Bitmap bitmap)
{
    IntPtr hBitmap = bitmap.GetHbitmap();
    BitmapImage retval;

    try
    {
        retval = (BitmapImage)Imaging.CreateBitmapSourceFromHBitmap(
                     hBitmap,
                     IntPtr.Zero,
                     Int32Rect.Empty,
                     BitmapSizeOptions.FromEmptyOptions());
    }
    finally
    {
        DeleteObject(hBitmap);
    }

    return retval;
}
2020-05-19