如何在不先将位图保存到文件系统的情况下将内存中的位图保存到 ZipArchive?

How do I save an in memory Bitmap to a ZipArchive without saving the Bitmap to the file system first?

所以我有一些代码可以捕获屏幕并将其保存到 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

This stream from ZipArchiveEntry does not support seeking.

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

许多文件格式都有指向文件其他部分的指针或长度值,这些可能事先并不知道。最简单的方法是先写入零,然后写入数据,然后寻求更改值。如果使用这种方式,就没有办法得到这个,所以你需要先将数据写入MemoryStream,然后将结果数据写入ZipStream,如你所说。

这并没有真正添加那么多代码,只是对问题的简单修复。