0

私は自分でこれを理解したいと思っていましたが、何時間もグーグルした後、仕事に就けない例が無数にあります。これがシナリオです。うまくいけば、誰かが簡単な解決策を提供できます。

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の使用に依存していますが、それがどのように機能するかはわかりません。この場合は関係がないようです。私ができる最善の方法は、画像を画面に表示することですが、実際にはポップアップウィンドウに添付されていません. これは、ポップアップ ウィンドウ クラス内のメソッドである次のコードを使用して行いました。

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の位置に表示されたようです。

4

1 に答える 1

0

System.Drawing は WinForms-Namespace であるため、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

このコンバーターを使用すると、base64 文字列をオブジェクトのプロパティとして公開し、イメージ コントロールの Source プロパティをそれにバインドできます。

編集:コンバーターの使用方法の例を次に示します。

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

静的文字列リソースの代わりに、WPF によって認識され、base64 でエンコードされた形式で画像を返すバインドされたオブジェクトの任意のプロパティを使用できます。

于 2013-05-17T17:31:24.240 に答える