C#.NET:将图标转换为字节[],然后再转换回来
如何在C#.NET:将图标转换为字节[],然后再转换回来,c#,.net,C#,.net,如何在系统.Drawing.Icon类型和字节[]之间转换?我正在寻找(希望)能在.NET2中工作的简单工具。您可以通过内存流,基本上: public static byte[] IconToBytes(Icon icon) { using (MemoryStream ms = new MemoryStream()) { icon.Save(ms); return ms.ToArray(); } } public static Icon
系统.Drawing.Icon
类型和字节[]
之间转换?我正在寻找(希望)能在.NET2中工作的简单工具。您可以通过内存流
,基本上:
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);
}
}
(历史注释:我不确定处理传递给构造函数的流是否安全。例如,位图
,这样做是不安全的,因为它会保留流,以后可能会从流中读取。显然,图标
是可以的。我希望MSDN能更清楚地说明这一点……请参见:
Ex(有多种方式)
以及:
。。。再回来
public static Icon IconFromBytes(byte[] bytes) {
using(var ms = new MemoryStream(bytes)) {
return new Icon(ms);
}
}
Icon类在构建流后立即从流中读取。关闭MS没有坏处。不,不要调用
GetBuffer
——这可能会在结尾处有额外的0ToArray
是正确的调用。谢谢,注意。我真的只是从链接中复制了一些东西。它有多种解决方案。谷歌上20秒:)值得一提的是,这里“保存”的字节与写入文件的字节(因此它包括文件头、任何适用的压缩等)完全相同,而不是图像本身的字节。是的,如果需要,你可以将其制成位图并提取像素数组。只是好奇,您将MemoryStream
整齐地包装在一个using块中,为什么不以相反的BytesToIcon
方法同样包装呢?无需再处理ms?我可以验证Icon在流构建后立即读取流。@BC:谢谢-现在使用语句正式包装在中:)要详细说明吗?我同意MemoryStream不需要处理,因为它没有非托管资源。。。但它强化了在实现IDisposable时调用dispose的整个想法。@Hans Passant:不确定你的意思,但也许你的意思是问dispose做什么?如果一个类实现了IDisposable
,那么将其包装在using块中几乎是强制性的。由于.NET中缺少多重继承,某些类实现了IDisposable
,而从技术上讲它们不需要这样做。MemoryStream是一个实现非托管代码(WaitHandle)的类,要求您使用using
或try/finally。这里正确地应用了它。在不需要的情况下(我想到了IComponent的一些实现),为了清晰起见,通常最好还是使用using
。PS:如果您需要一个示例,请参阅Jon Skeet在我对Dispose的评论后如何更正自己的代码。嗯,我们必须就不同意这一点达成一致。请注意,我并没有投反对票,这只是一个戳眼睛。
Bitmap bmpIcon = icon.ToBitmap();
using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
{
bmpIcon.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);
return ms.ToArray();
}
public static Icon IconFromBytes(byte[] bytes) {
using(var ms = new MemoryStream(bytes)) {
return new Icon(ms);
}
}