Gabe Miller
Gabe Miller

Reputation: 132

Get image from resource dll as MemoryStream

I use WPF and my program has images in a DLL resource file. I have this well working way to read in images from disk:

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

Now, how can I get images in this MemoryStream-way from a DLL resource?

The basic problem: If I use simply the "bitmap.UriSource = whatever uri" way and load many images in sequence like an animation it builds up the memory. I tried with the above memorystream way and it worked perfectly fine, but then I store my images in a dll and I don't know how to do this trick. If anybody knows how to read many images from a managed dll without building up the memory pls, let me know.

Upvotes: 1

Views: 2295

Answers (1)

Gabe Miller
Gabe Miller

Reputation: 132

I found the answer to my question. I put it here for others who may need it. There are more ways to load images from a resource dll file. The easiest way to initialize the BitmapImage and set bi.UriSource=uriPath (where the path looks like I show below) but when you load images in a sequence, as an animation for example, it seems to take a lot of memory. Then you can use a StreamResourceInfo as shown below and just put like bi.StreamSource = sri.Stream. That works, too, but memorywise it has same results. So in practice I found the following way the fastest and most memory efficient way to load hundreds of images in a sequence:

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

Where the uriPath is something like: "pack://application:,,,/YourDLL;Component/YourImageFile.jpg"

Upvotes: 1

Related Questions