如何在
.NET2
中简单地将 System.Drawing.Icon
类型和 byte[]
之间进行转换?请确保不改变原始含义。你可以通过一个 MemoryStream
来实现,基本上是这样的:
public static byte[] IconToBytes(Icon icon)
{
using (MemoryStream ms = new MemoryStream())
{
icon.Save(ms);
return ms.ToArray();
}
}
public static Icon BytesToIcon(byte[] bytes)
{
using (MemoryStream ms = new MemoryStream(bytes))
{
return new Icon(ms);
}
}
(历史注:我曾不确定是否安全地处理传递给构造函数的流。例如,对于保留流并稍后从中读取的Bitmap
,这样做是不安全的...但显然对于Icon
来说是可以的。我希望MSDN能更明确地说明这一点...)
private byte[] GetBytes( Icon icon )
{
MemoryStream ms = new MemoryStream();
icon.Save( ms );
return ms.ToArray();
}
并且:
Bitmap bmpIcon = icon.ToBitmap();
using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
{
bmpIcon.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);
return ms.ToArray();
}
GetBuffer
- 它可能会在末尾有多余的0。使用ToArray
是正确的方法。 - Jon Skeet...然后再返回
public static Icon IconFromBytes(byte[] bytes) {
using(var ms = new MemoryStream(bytes)) {
return new Icon(ms);
}
}
Icon类在构造时立即从流中读取。关闭MS没有任何问题。
IDisposable
,那么将其包装在using块中几乎是强制性的。由于.NET中缺少多重继承,某些类实现了IDisposable
,尽管它们在技术上不需要。MemoryStream是一个实现了非托管代码(WaitHandle)的类,需要使用using
或try/finally。这里应用得很正确。在不需要的情况下(一些IComponent的实现),为了清晰起见,通常最好仍然使用using
。 - Abel
MemoryStream
中很好地使用了using-block,为什么在反向的BytesToIcon
方法中不同等呢?不再需要处理ms? - Abelusing
语句包装好了 :) - Jon Skeet