32

Web リクエストから取得した png および gif バイトからBitmapImageの作成に問題があります。MemoryStreamバイトは正常にダウンロードされたように見え、BitmapImageオブジェクトは問題なく作成されますが、画像は実際には UI にレンダリングされません。この問題は、ダウンロードした画像のタイプが png または gif の場合にのみ発生します (jpeg では問題なく動作します)。

問題を示すコードは次のとおりです。

var webResponse = webRequest.GetResponse();
var stream = webResponse.GetResponseStream();
if (stream.CanRead)
{
    Byte[] buffer = new Byte[webResponse.ContentLength];
    stream.Read(buffer, 0, buffer.Length);

    var byteStream = new System.IO.MemoryStream(buffer);

    BitmapImage bi = new BitmapImage();
    bi.BeginInit();
    bi.DecodePixelWidth = 30;
    bi.StreamSource = byteStream;
    bi.EndInit();

    byteStream.Close();
    stream.Close();

    return bi;
}

Web リクエストがバイトを正しく取得していることをテストするために、バイトをディスク上のファイルに保存し、 aUriSourceではなく aを使用して画像をロードする次のことを試しました。これStreamSourceはすべての画像タイプで機能します。

var webResponse = webRequest.GetResponse();
var stream = webResponse.GetResponseStream();
if (stream.CanRead)
{
    Byte[] buffer = new Byte[webResponse.ContentLength];
    stream.Read(buffer, 0, buffer.Length);

    string fName = "c:\\" + ((Uri)value).Segments.Last();
    System.IO.File.WriteAllBytes(fName, buffer);

    BitmapImage bi = new BitmapImage();
    bi.BeginInit();
    bi.DecodePixelWidth = 30;
    bi.UriSource = new Uri(fName);
    bi.EndInit();

    stream.Close();

    return bi;
}

誰もが輝く光を持っていますか?

4

2 に答える 2

51

bi.CacheOption = BitmapCacheOption.OnLoadの直後に追加します.BeginInit():

BitmapImage bi = new BitmapImage();
bi.BeginInit();
bi.CacheOption = BitmapCacheOption.OnLoad;
...

これがないと、BitmapImage はデフォルトで遅延初期化を使用し、ストリームはそれまでに閉じられます。最初の例では、おそらくガベージコレクションされたクローズドまたは破棄された MemoryStreamからイメージを読み取ろうとします。2 番目の例では、まだ利用可能なファイルを使用しています。また、書かないでください

var byteStream = new System.IO.MemoryStream(buffer);

より良い

using (MemoryStream byteStream = new MemoryStream(buffer))
{
   ...
}
于 2010-02-12T09:45:47.747 に答える
13

私はこのコードを使用しています:

public static BitmapImage GetBitmapImage(byte[] imageBytes)
{
   var bitmapImage = new BitmapImage();
   bitmapImage.BeginInit();
   bitmapImage.StreamSource = new MemoryStream(imageBytes);
   bitmapImage.EndInit();
   return bitmapImage;
}

この行を削除する必要があるかもしれません:

bi.DecodePixelWidth = 30;
于 2010-01-20T00:07:38.020 に答える