【发布时间】:2013-06-25 11:31:59
【问题描述】:
我正在制作远程桌面共享应用程序,在该应用程序中我捕获桌面图像并将其压缩并将其发送到接收器。要压缩图像,我需要将其转换为 byte[]。
目前我正在使用这个:
public byte[] imageToByteArray(System.Drawing.Image imageIn)
{
MemoryStream ms = new MemoryStream();
imageIn.Save(ms,System.Drawing.Imaging.ImageFormat.Gif);
return ms.ToArray();
}
public Image byteArrayToImage(byte[] byteArrayIn)
{
MemoryStream ms = new MemoryStream(byteArrayIn);
Image returnImage = Image.FromStream(ms);
return returnImage;
}
但我不喜欢它,因为我必须将它保存在 ImageFormat 中,这也可能会占用资源(减慢速度)以及产生不同的压缩结果。我已经阅读过使用 Marshal.Copy 和 memcpy 但我我无法理解它们。
那么还有其他方法可以实现这个目标吗?
【问题讨论】:
-
MemoryStream 和 Image 都有一个 dispose 方法,请确保您正在 Disposing 它们,因为这会导致 MemoryLeaks。
-
@abc123:你不需要处理
MemoryStream;它是一个完全托管的资源,除非您在远程处理中使用它。在这两种情况下,处置资源都是不合适的。 -
@JonSkeet 很有趣,你做过基准测试吗?查看 .net 释放对象的速度?我知道 DataTable 也有类似的论点,但 GarbageCollector 收集使用 dispose 时分配的内存的速度存在明显差异。
-
@abc123:我真的不希望有 - 处理流不会对数组做任何事情,而且 MemoryStream 没有终结器(与 DataTable 不同,它继承自MarshalByValueComponent)。
-
有完整源代码的最终解决方案吗?
标签: c# memory bitmap bytearray