2011-10-24 44 views
1

我使用WPF和我的程序在DLL资源文件中有图像。我有这口井的工作方式,从磁盘读取图片:从资源DLL获取图像作为MemoryStream

Private Function GetImageFromFile(ByVal fileName As String) As BitmapImage 
    Dim buffer As Byte() = IO.File.ReadAllBytes(fileName) 
    Dim memoryStream As New IO.MemoryStream(buffer) 

    Dim bitmap As New BitmapImage() 
    bitmap.BeginInit() 
    bitmap.StreamSource = memoryStream 
    bitmap.EndInit() 
    bitmap.Freeze() 

    Return bitmap 
End Function 

现在,我怎样才能从一个DLL资源此MemoryStream的路图像?

基本问题:如果我简单地使用“bitmap.UriSource =无论uri”的方式,并像动画一样按顺序加载许多图像,它会建立内存。我试着用上面的内存流方式,它工作得很好,但后来我把我的图像存储在一个DLL中,我不知道如何做这个技巧。如果有人知道如何从一个托管的dll读取许多图像,而不会增加内存空间,请告诉我。

回答

1

我找到了我的问题的答案。我把它放在这里供其他需要它的人使用。有更多的方法从资源dll文件中加载图像。初始化BitmapImage并设置bi.UriSource = uriPath(其中路径如下所示)的最简单方法是,但是当您按序列加载图像时(例如以动画形式),它似乎需要大量内存。然后,您可以使用StreamResourceInfo,如下所示,只需放入bi.StreamSource = sri.Stream即可。这也适用,但记忆方面它有相同的结果。因此,在实践中我发现下面的方法最快最有效的记忆方式来加载上百张图片的顺序:

Public Function GetImageFromDLL(ByVal uriPath As String) As BitmapImage 
    Dim sri As Windows.Resources.StreamResourceInfo = Application.GetResourceStream(New Uri(uriPath, UriKind.Absolute)) 
    Dim binReader As New System.IO.BinaryReader(sri.Stream) 
    Dim buffer As Byte() = binReader.ReadBytes(sri.Stream.Length) 
    Dim memoryStream As New IO.MemoryStream(buffer) 

    Dim bi As New BitmapImage() 
    bi.BeginInit() 
    bi.CacheOption = BitmapCacheOption.Default 
    bi.CreateOptions = BitmapCreateOptions.None 
    bi.StreamSource = memoryStream 
    bi.EndInit() 
    bi.Freeze() 

    Return bi 
End Function 

凡uriPath是一样的东西:“包://应用:,,,/YourDLL ; Component/YourImageFile.jpg“

+0

很好的回答!我实际上使用它直接加载到WinForms报告工具中使用的位图。其他人都建议加载到BitmapImage并使用编码器保存到Bitmap可以查看的流中。但是,这是格式不可知的。 –