我有C#中的位图.我需要对图像进行操作.例如灰度zoom 、在图像上添加文本等.

我在Stackoverflow中找到了灰度函数,它接受位图并返回位图.

所以我需要将BitmapImage转换成Bitmap,做操作然后再转换回来.

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

推荐答案

没有必要使用 foreign 图书馆.

将位图图像转换为位图:

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;
}

.net相关问答推荐

防止在 .NET 上构建路径中的反斜杠以进行跨平台部署

无法解析此引用.找不到程序集

log4net 与 TraceSource

我可以使用 UriTemplate 将非字符串传递给 WCF RESTful 服务吗?

返回 IQueryable 或不返回 IQueryable

为什么 ?: 会导致转换错误,而 if-else 不会?

struct 中需要覆盖什么以确保平等正常运行?

String 是原始类型吗?

寻找 .NET 的命令行参数解析器

DataGridView 在我的两个屏幕之一上的可怕重绘性能

如何仅在需要时提升权限?

您可以使用 Xamarin 开发 Linux 应用程序吗?

ConcurrentDictionary TryRemove 何时返回 false

如何使用通用扩展方法中的字符串列名在 IQueryable 上应用 OrderBy?

MailMessage,Sender 和 From 属性的区别

铸造:(NewType)与对象作为NewType

C# 应用程序中的全局键盘捕获

如何在不使用 3rd 方库的情况下登录 C#?

C# 应用程序中的资源和嵌入式资源有什么区别?

如何将我的应用程序窗口置于最前面?