1

我们有一种将图标转换为给定大小的方法,如下所示:

private BitmapFrame GetSizedSource(Icon icon, int size)
{
    var stream = IconToStream(icon);
    var decoder = BitmapDecoder.Create(stream, BitmapCreateOptions.DelayCreation, BitmapCacheOption.OnDemand);
    var frame = decoder.Frames.SingleOrDefault(_ => Math.Abs(_.Width - size) < double.Epsilon);

    return frame;
}

private Stream IconToStream(Icon icon)
{
    using (var stream = new MemoryStream())
    {
        icon.Save(stream);
        stream.Position = 0;
        return stream;
    }
}

当我们传递图标时,它height/width是 32,参数size是 32。

实际上,decoder.Frame[0]宽度/高度是1.0,我不知道为什么?

我错过了什么?

4

1 回答 1

0

问题在于IconToStream创建MemoryStream,将图标复制到其中,返回引用,然后处理分配的所有资源,MemoryStream从而有效地使您的流变为Frame空。如果您要更改GetSizedSource为以下内容,则BitmapFrame在处置之前返回MemoryStream应该可以:

private BitmapFrame GetSizedSource(Icon icon, int size)
{
   using (var stream = new MemoryStream())
   {
      icon.Save(stream);
      stream.Position = 0;
      return BitmapDecoder.Create(stream, BitmapCreateOptions.DelayCreation, BitmapCacheOption.OnDemand)
                .Frames
                .SingleOrDefault(_ => Math.Abs(_.Width - size) < double.Epsilon);
   }
}
于 2013-08-27T10:00:16.750 回答