2011-10-24 5 views
1

J'utilise WPF et mon programme contient des images dans un fichier de ressources DLL. J'ai cette façon de travailler bien à lire des images à partir du disque:Obtenir l'image de la ressource dll en tant que 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 

Maintenant, comment puis-je obtenir des images dans ce sens MemoryStream d'une ressource de DLL?

Le problème de base: Si j'utilise simplement la méthode "bitmap.UriSource = quel que soit l'uri" et que je charge de nombreuses images en séquence comme une animation, cela crée de la mémoire. J'ai essayé avec le chemin de mémoire ci-dessus et cela a fonctionné parfaitement bien, mais alors je stocke mes images dans une DLL et je ne sais pas comment faire cette astuce. Si quelqu'un sait comment lire de nombreuses images à partir d'une DLL gérée sans construire les pls de la mémoire, faites le moi savoir.

Répondre

1

J'ai trouvé la réponse à ma question. Je l'ai mis ici pour les autres qui pourraient en avoir besoin. Il existe plusieurs façons de charger des images à partir d'un fichier dll de ressources. La façon la plus simple d'initialiser BitmapImage et de définir bi.UriSource = uriPath (où le chemin ressemble à ce que je montre ci-dessous) mais quand vous chargez des images dans une séquence, comme une animation par exemple, cela prend beaucoup de mémoire. Ensuite, vous pouvez utiliser un StreamResourceInfo comme indiqué ci-dessous et juste mettre comme bi.StreamSource = sri.Stream. Cela fonctionne aussi, mais dans la mémoire, il a les mêmes résultats. Donc, en pratique, je trouve la manière suivante la plus rapide et la mémoire de manière efficace pour charger des centaines d'images dans une séquence:

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 

Lorsque le uriPath est quelque chose comme: « paquet: // application: ,,,/YourDLL ; Component/YourImageFile.jpg "

+0

Bonne réponse! J'ai effectivement utilisé ceci pour charger directement dans un bitmap pour une utilisation dans un outil de reporting WinForms. Tout le monde a suggéré de charger dans une image BitmapImage et d'utiliser un encodeur pour sauvegarder dans un flux qu'un bitmap pourrait voir. Ceci, cependant, est agnostique de format. –

Questions connexes