Получить изображение из ресурса dll как MemoryStream - PullRequest
1 голос
/ 24 октября 2011

Я использую 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

Теперь, как я могу получить изображения в этом MemoryStream-пути из ресурса DLL?

Основная проблема: если я просто использую способ «bitmap.UriSource = what uri» и загружаю много изображений последовательно, например, анимацию, это накапливает память. Я попытался с вышеупомянутым способом потока памяти, и это работало прекрасно, но затем я храню свои изображения в DLL, и я не знаю, как сделать этот трюк. Если кто-нибудь знает, как читать много изображений из управляемой библиотеки DLL, не наращивая память, пожалуйста, дайте мне знать.

1 Ответ

1 голос
/ 12 ноября 2011

Я нашел ответ на свой вопрос. Я положил это здесь для тех, кто может нуждаться в этом. Есть больше способов загрузить изображения из файла 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"

...