2011-10-24 5 views
1

私はWPFを使用し、私のプログラムにはDLLリソースファイルのイメージがあります。リソースdllから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 

ここで、このMemoryStream方式のイメージをDLLリソースから取得するにはどうしたらいいですか?

基本的な問題:単純に "bitmap.UriSource = whatever uri"の方法でアニメーションのように連続して多くのイメージを読み込むと、メモリが増えます。私は上記のmemorystreamの方法で試して、それは完全に正常に働いたが、私はdllに自分のイメージを格納し、私はこのトリックを行う方法を知らない。誰かがメモリのplsを構築せずに管理されたdllから多くのイメージを読む方法を知っているなら、私に知らせてください。

答えて

1

私の質問に対する答えが見つかりました。私はそれを必要とするかもしれない他の人のためにここに置いた。リソースdllファイルから画像を読み込む方法はまだまだあります。 BitmapImageを初期化し、bi.UriSource = uriPathを設定する最も簡単な方法です(ここでのパスは次のようになります)。しかし、イメージをシーケンス内にロードすると、たとえばアニメーションとしてメモリが大量にかかるようです。次に、下に示すようにStreamResourceInfoを使用して、単にbi.StreamSource = sri.Streamのように配置します。それもうまくいくが、記憶的には同じ結果がある。 「パック:uriPathのようなものです

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 

:だから実際には、私はシーケンス内の画像の数百人をロードするための最速かつ最もメモリ効率的な方法以下の方法を見つけた//アプリケーション:,,,/YourDLL ; Component/YourImageFile.jpg "

+0

すばらしい答え!私は実際にWinFormsのレポートツールで使用するために、これをビットマップに直接ロードするために使用しました。他の誰もが、BitmapImageにロードし、ビットマップが見ることができるストリームに保存するためにエンコーダを使用することを提案しました。しかし、これはフォーマットに依存しません。 –

関連する問題