从资源dll获取图像作为MemoryStream

时间:2011-10-24 05:29:24

标签: wpf vb.net image memorystream

我使用WPF,我的程序在DLL资源文件中有图像。我有一个很好的工作方式来读取磁盘中的图像:

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 = any uri”方式并按顺序加载许多图像,就像动画一样,它会构建内存。我尝试使用上面的内存流方式,它工作得很好,但后来我将我的图像存储在一个DLL中,我不知道如何做这个技巧。如果有人知道如何在不增加内存的情况下从托管dll中读取许多图像,请告诉我。

1 个答案:

答案 0 :(得分: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的位置如下:“pack:// application:,,, / YourDLL; Component / YourImageFile.jpg”