【问题标题】:How do I save an in memory Bitmap to a ZipArchive without saving the Bitmap to the file system first?如何在不先将位图保存到文件系统的情况下将内存中的位图保存到 ZipArchive?
【发布时间】:2015-06-13 04:34:25
【问题描述】:

所以我有一些代码可以捕获屏幕并将其保存到 jpeg 文件中。这很好用,但是我想将 jpeg 编码的捕获保存到新的 ZipArchive 而不先将位图写入文件系统。

这是我目前所拥有的:

FileInfo zipArchive = new FileInfo(fileToZip.FullName + ".zip");

using (ZipArchive zipFile = ZipFile.Open(zipArchive.FullName, ZipArchiveMode.Create)))
{
    ZipArchiveEntry zae = zipFile.CreateEntry(fileToZip.FullName, CompressionLevel.Optimal);
    using (Stream zipStream = zae.Open())
        bmp.Save(zipStream, ImageFormat.Jpeg);
 }

问题是在bmp.Save() 行上抛出了System.NotSupportedException

来自 ZipArchiveEntry 的此流不支持搜索。

我已经看到很多直接写入从 zae.Open() 返回的 Stream 的示例,所以我不确定为什么这不起作用,因为我认为所有 bmp.Save() 需要做的就是写入,而不是查找.我不知道这是否可行,但我不想将位图保存到MemoryStream 并将该流复制到从zae.Open() 返回的流,因为这感觉像是不必要的额外工作。我错过了什么明显的东西吗?

【问题讨论】:

    标签: c# file bitmap ziparchive in-memory


    【解决方案1】:

    许多文件格式都有指向文件其他部分或长度值的指针,这些值可能事先不知道。最简单的方法是先写入零,然后写入数据,然后尝试更改值。如果使用这种方式,则无法通过,因此您需要先将数据写入MemoryStream,然后将结果数据写入ZipStream,如您所述。

    这并没有真正添加那么多代码,只是解决问题的简单方法。

    【讨论】:

    • 感谢您提供有关文件内指针/长度以及如何添加搜索要求的提示,我没有想到这一点。我开始尝试使用临时内存流将位图保存到然后复制到 zipStream,一切似乎都正常,但结果是:它创建了包含图像文件的 zip 文件,但图像文件为空。我尝试手动刷新临时 MemoryStream 然后 zipStream 但这也没有做任何事情。我至少觉得我现在在写作轨道上,所以谢谢!。
    • 发布此内容 5 分钟后,我得到了它的工作,我只是忘记在调用 bmp.Save() 后返回到 tmpSteam 的开头。谢谢,我想我一直都有答案,但感觉就像我习惯了很多流。
    猜你喜欢
    • 2013-03-16
    • 1970-01-01
    • 2013-11-04
    • 1970-01-01
    • 2012-08-10
    • 1970-01-01
    • 2011-05-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多