Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#.NET:将图标转换为字节[],然后再转换回来_C#_.net - Fatal编程技术网

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
——这可能会在结尾处有额外的0
ToArray
是正确的调用。谢谢,注意。我真的只是从链接中复制了一些东西。它有多种解决方案。谷歌上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);
     }
}