代码之家  ›  专栏  ›  技术社区  ›  Simon Fox

从memorystream png、gif创建wpf位图图像

  •  26
  • Simon Fox  · 技术社区  · 15 年前

    我在创建 BitmapImage 从A MemoryStream 从Web请求获得的PNG和GIF字节。字节似乎下载得很好, 位图图像 对象的创建没有问题,但是图像实际上没有在我的用户界面上呈现。只有当下载的图像类型为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请求是否正确获取字节,我尝试以下操作:将字节保存到磁盘上的文件中,然后使用 UriSource 而不是 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;
    }
    

    有人能照到光吗?

    2 回复  |  直到 15 年前
        1
  •  47
  •   Matt Roberts    11 年前

    添加 bi.CacheOption = BitmapCacheOption.OnLoad 直接在你的 .BeginInit() :

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

    如果不这样做,BitmapImage默认使用延迟初始化,届时流将关闭。在第一个示例中,您尝试从 垃圾收集 已关闭或甚至已释放内存流。第二个例子使用了仍然可用的文件。 另外,不要写

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

    更好的

    using (MemoryStream byteStream = new MemoryStream(buffer))
    {
       ...
    }
    
        2
  •  11
  •   some_engineer    15 年前

    我使用的代码是:

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

    可能您应该删除此行:

    bi.DecodePixelWidth = 30;