【问题标题】:Image to byte[] hangs indefinitely图像到字节 [] 无限期挂起
【发布时间】:2017-02-12 14:18:59
【问题描述】:
var originalImageBytes = originalFile.FileBytes();

// Convert bytes to image
Image originalImage;
using (var ms = new MemoryStream(originalImageBytes))
{
    originalImage = Image.FromStream(ms);
}

// Convert back to byte array
using (var ms = new MemoryStream())
{
    originalImage.Save(ms, ImageFormat.Png);
    return ms.ToArray();
}

在任何时候返回originalImageBytes 都可以正常工作,但是程序会无限期地挂在最后的return ms.ToArray() 行上。

为什么ms.ToArray() 会导致挂起?

【问题讨论】:

    标签: c# arrays image memorystream


    【解决方案1】:

    这可能与 Image 使用 Stream 的一些奇怪行为有关。你have to keep open the stream 直到你完成图像,因为Image 可以随意延迟加载内容。

    Save 实际上可能会触发读取(然后)关闭和处置的MemoryStream。如果不关闭流,请尝试看看会发生什么。

    【讨论】:

    • 谢谢,你是对的。如果我将第一个块更改为 Bitmap originalImage; using (var ms = new MemoryStream(originalImageBytes)) { originalImage = new Bitmap(Image.FromStream(ms)); } 它工作正常。
    • 对于其他阅读本文的人,不要执行上面的代码!我认为 .net 垃圾收集器会弄乱它,即使从 Image 对象创建 Bitmap 对象也会出现奇怪的行为。为整个方法保持原始图像内存流打开是唯一可以正常工作的方法。
    • 那是因为图像严重依赖于 Windows 的句柄。关闭内存流会清除它引用的内存块。
    猜你喜欢
    • 2017-06-29
    • 2011-05-07
    • 2021-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-29
    • 2019-08-01
    • 1970-01-01
    相关资源
    最近更新 更多