【问题标题】:How to convert Bitmap to BitmapImage for WPF VB.NET [duplicate]如何将位图转换为 WPF VB.NET 的位图图像 [重复]
【发布时间】:2013-11-30 09:08:51
【问题描述】:

我正在尝试将位图转换为 WPF 中的位图图像。基本上,我从在内存中(来自另一个进程)创建的位图开始,我需要在其他地方使用它,但作为 BitmapImage。

我找到了这个答案question 6484357,但是作者的函数 Bitmap2BitmapImage 不起作用(至少在 DotNet4.5 中),因为没有这样的方法称为 Imaging.CreateBitmapSourceFromHBitmap - 所以那里没有运气(至少没有办法转换为VB.Net 等效函数)。

【问题讨论】:

  • Imaging.CreateBitmapSourceFromHBitmap 在System.Windows.Interop.Imaging
  • :) 很高兴我能帮上忙。

标签: c# wpf vb.net bitmap bitmapimage


【解决方案1】:

合并问题6484357并翻译成vb.net

Imports System
Imports System.Drawing
Imports System.IO
Imports System.Windows
Imports System.Windows.Interop
Imports System.Windows.Media.Imaging

Namespace StackConsoleTesting
Class Program

    Private Function BitmapImage2Bitmap(bitmapImage As BitmapImage) As Bitmap
        BitmapImage bitmapImage = new BitmapImage(new Uri("../Images/test.png", UriKind.Relative));

        Using outStream = New MemoryStream()
            Dim enc As BitmapEncoder = New BmpBitmapEncoder()
            enc.Frames.Add(BitmapFrame.Create(bitmapImage))
            enc.Save(outStream)
            Dim bitmap As New System.Drawing.Bitmap(outStream)

            Return New Bitmap(bitmap)
        End Using
    End Function

    <System.Runtime.InteropServices.DllImport("gdi32.dll")> _
    Public Shared Function DeleteObject(hObject As IntPtr) As Boolean
    End Function

    Private Function Bitmap2BitmapImage(bitmap As Bitmap) As BitmapImage
        Dim hBitmap As IntPtr = bitmap.GetHbitmap()
        Dim retval As BitmapImage

        Try

            Dim bitmapSource = Imaging.CreateBitmapSourceFromHBitmap(hBitmap, IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions())

            Dim encoder = New BmpBitmapEncoder()
            Dim memoryStream = New MemoryStream()

            encoder.Frames.Add(BitmapFrame.Create(bitmapSource))
            encoder.Save(memoryStream)

            retval.BeginInit()
            retval.StreamSource = New MemoryStream(memoryStream.ToArray())
            retval.EndInit()

            memoryStream.Close()

        Return retval
    End Function
End Class
End Namespace

【讨论】:

  • 我正在导入 System.Drawing.Imaging,所以我不得不将 Imaging.CreateBitmapSourceFromHBitmap 更改为 System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap
  • 说得太早了。 DirectCast 生成错误。 “无法将 'System.Windows.Interop.InteropBitmap' 类型的对象转换为 'System.Windows.Media.Imaging.BitmapImage'。”
  • 我正在努力让它正常工作,引用的问题(标记为重复)创建一个位图源 - 有效,但问题是创建一个 BITMAP - 提供的功能不起作用按照编码(至少不是在 VB.Net 中) - 一旦我进行更多研究,我应该很快就会有一个工作功能。
  • 请参阅 Trae 帖子末尾的更正(不知道为什么,但编辑没有显示为代码块)。它已经过全面测试并且工作正常。
  • 我将 JpegBitmapEncoder 更改为 BmpBitmapEncoder 以获得性能 Dim encoder = New BmpBitmapEncoder()
猜你喜欢
  • 2019-05-29
  • 1970-01-01
  • 2016-08-16
  • 2012-03-11
  • 2014-01-26
  • 2015-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多