我使用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中读取许多图像,请告诉我。
答案 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”