vbwpf中使用DrawImage的简单示例

vbwpf中使用DrawImage的简单示例,wpf,vb.net,visual-studio,graphics,Wpf,Vb.net,Visual Studio,Graphics,我希望自己能解决这个问题,但在谷歌搜索了几个小时后,我有无数的例子,我无法找到工作。下面是一个场景。希望有人能提供一个简单的解决方案 我有一个VB WPF应用程序。它与特定的web服务通信以获取图像的Base64字符串。我可以使用以下代码将此字符串转换为System.Drawing.Image对象: Public Function Base64ToImage(ByVal base64str As String) As System.Drawing.Image 'Setup image a

我希望自己能解决这个问题,但在谷歌搜索了几个小时后,我有无数的例子,我无法找到工作。下面是一个场景。希望有人能提供一个简单的解决方案

我有一个VB WPF应用程序。它与特定的web服务通信以获取图像的Base64字符串。我可以使用以下代码将此字符串转换为System.Drawing.Image对象:

Public Function Base64ToImage(ByVal base64str As String) As System.Drawing.Image
    'Setup image and get data stream together
    Dim img As System.Drawing.Image
    Dim MS As System.IO.MemoryStream = New System.IO.MemoryStream
    Dim b64 As String = base64str.Replace(" ", "+")
    Dim b() As Byte

    'Converts the base64 encoded msg to image data
    b = Convert.FromBase64String(b64)
    MS = New System.IO.MemoryStream(b)

    'creates image
    img = System.Drawing.Image.FromStream(MS)

    Return img
End Function
然后我打开一个弹出窗口,我想做的就是在弹出窗口中显示这个图像。我发现的示例依赖于使用PaintEventArgs,但我不确定它是如何工作的,在本例中似乎不相关。我能做的最好的事情就是让图像显示在屏幕上,但它实际上并没有连接到弹出窗口。我使用以下代码实现了这一点,这是popup window类中的一个方法:

Dim img as System.Drawing.Image = Base64ToImage(base64string)
Dim gr As System.Drawing.Graphics = System.Drawing.Graphics.FromHwnd(New Interop.WindowInteropHelper(Me).Handle)
gr.DrawImage(img, 10, 10, 500, 800)

gr.Dispose()

这显示了图像,但它似乎出现在屏幕的位置10,10,而不是弹出窗口的位置。

System.Drawing是WinForms名称空间,因此无法与WPF配合使用。您可以使用此转换器将base64字符串转换为可由WPF使用的bitmapsource:

<ValueConversion(GetType(String), GetType(BitmapSource))> _
Public Class Base64ToImageConverter
Implements IValueConverter

Public Function Convert(ByVal value As Object, ByVal targetType As System.Type, ByVal parameter As Object, ByVal culture As System.Globalization.CultureInfo) As Object Implements System.Windows.Data.IValueConverter.Convert
    Try
        Return Base64ToImage(value)
    Catch ex As Exception
        If TypeOf parameter Is BitmapSource Then
            Return parameter
        End If
        Return Binding.DoNothing
    End Try
End Function

Public Function ConvertBack(ByVal value As Object, ByVal targetType As System.Type, ByVal parameter As Object, ByVal culture As System.Globalization.CultureInfo) As Object Implements System.Windows.Data.IValueConverter.ConvertBack
    Try
        Return ImageToBase64(value)
    Catch ex As Exception
        Return Binding.DoNothing
    End Try
End Function

Public Shared Function Base64ToImage(ByVal imageString As String) As BitmapSource
    Dim buffer() As Byte = System.Convert.FromBase64String(imageString)
    Dim stream As New System.IO.MemoryStream(buffer)
    Dim result As New BitmapImage()
    With result
        .BeginInit()
        .StreamSource = stream
        .EndInit()
    End With
    Return result
End Function

Public Shared Function ImageToBase64(ByVal image As BitmapSource) As String
    Dim encoder As New PngBitmapEncoder
    encoder.Frames.Add(BitmapFrame.Create(image))
    Dim stream As New System.IO.MemoryStream
    encoder.Save(stream)
    stream.Seek(0, IO.SeekOrigin.Begin)
    Dim buffer() As Byte = New System.IO.BinaryReader(stream).ReadBytes(stream.Length)
    stream.Close()
    Dim result As String = System.Convert.ToBase64String(buffer)
    Return result
End Function

End Class
_
公共类Base64ToImageConverter
实现IValueConverter
公共函数转换(ByVal值作为对象,ByVal targetType作为系统.Type,ByVal参数作为对象,ByVal区域性作为系统.Globalization.CultureInfo)作为对象实现System.Windows.Data.IValueConverter.Convert
尝试
返回Base64ToImage(值)
特例
如果TypeOf参数为BitmapSource,则
返回参数
如果结束
返回绑定
结束尝试
端函数
作为对象的公共函数ConvertBack(ByVal值作为对象,ByVal targetType作为系统.Type,ByVal参数作为对象,ByVal区域性作为系统.Globalization.CultureInfo)实现System.Windows.Data.IValueConverter.ConvertBack
尝试
返回ImageToBase64(值)
特例
返回绑定
结束尝试
端函数
作为位图源的公共共享函数Base64ToImage(ByVal imageString作为字符串)
Dim buffer()的字节=System.Convert.FromBase64String(imageString)
Dim流作为新的System.IO.MemoryStream(缓冲区)
将结果变暗为新的BitmapImage()
结果
.BeginInit()
.StreamSource=流
.EndInit()
以
返回结果
端函数
公共共享函数ImageToBase64(ByVal图像作为位图源)作为字符串
Dim编码器作为新的PngBitmapEncoder
编码器.帧.添加(位图帧.创建(图像))
作为新System.IO.MemoryStream的暗流
编码器。保存(流)
stream.Seek(0,IO.SeekOrigin.Begin)
Dim buffer()的形式为Byte=New System.IO.BinaryReader(stream.ReadBytes(stream.Length)
stream.Close()
作为字符串的Dim结果=System.Convert.ToBase64String(缓冲区)
返回结果
端函数
末级
使用此转换器,可以将base64字符串作为对象的属性公开,并将图像控件的源属性绑定到该对象

编辑:以下是如何使用转换器的示例:

    <Window.Resources>
    <s:String x:Key="TestImageString">iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAABjUExURXK45////6fT8PX6/bTZ8onE643F7Pf7/pDH7PP5/dns+b7e9MPh9Xq86NHo947G7Hm76NTp+PL4/bHY8ojD67rc85bK7b3e9MTh9dLo97vd8/D3/Hy96Xe76Nfr+H+/6f///1bvXooAAAAhdFJOU///////////////////////////////////////////AJ/B0CEAAACHSURBVHjaXI/ZFoMgEEMzLCqg1q37Yv//KxvAlh7zMuQeyAS8d8I2z8PT/AMDShWQfCYJHL0FmlcXSQTGi7NNLSMwR2BQaXE1IfAguPFx5UQmeqwEHSfviz7w0BIMyU86khBDZ8DLfWHOGPJahe66MKe/fIupXKst1VXxW/VgT/3utz99BBgA4P0So6hyl+QAAAAASUVORK5CYIII</s:String>
    <t:Base64ToImageConverter x:Key="converter"/>
    <t:ImageToBase64Converter x:Key="backConverter"/>
    <BitmapImage x:Key="defaultImage" UriSource="/delete_24.png"/>
</Window.Resources>
<StackPanel>
    <Image x:Name="Image" Source="{Binding Source={StaticResource TestImageString}, Converter={StaticResource converter}, ConverterParameter={StaticResource defaultImage}}" Stretch="None"/>
    <TextBlock x:Name="ConvertedImage" Text="{Binding ElementName=Image, Path=Source, Converter={StaticResource backConverter}, ConverterParameter={StaticResource defaultImage}}"/>
    <Image x:Name="CheckImage" Source="{Binding ElementName=ConvertedImage, Path=Text, Converter={StaticResource converter}, ConverterParameter={StaticResource defaultImage}}" Stretch="None"/>
</StackPanel>

这句话的意思是“WeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWe/////AJ/B0CEAACHSURBVHJAXI/ZFoMgEEMzLCqg1q37Yv//KxvAlh7zMuQeyAS8d8I2z8PT/AMDShWQfCYJHL0FmlcXSQTGi7NNLSMwR2BQaXE1IfAguPFx5UQmeqwEHSfviz7w0BIMyU86khBDZ8DLfWHOGPJahe66MKe/FIUPXKST1VXW/VgT/3utz99BBgA4P0So6hyl+QAAUV5KYII

您可以在绑定对象上使用任何属性,而不是静态字符串资源,该对象返回的图像格式由WPF识别并已进行base64编码。

WPF不关心
System.Drawing
。从您的项目中删除对它的所有引用。感谢您使用此转换器。你能提供一个我将如何使用它的例子吗?