如何在不先将位图保存到文件系统的情况下将内存中的位图保存到 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
,如你所说。
这并没有真正添加那么多代码,只是对问题的简单修复。
所以我有一些代码可以捕获屏幕并将其保存到 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
,如你所说。
这并没有真正添加那么多代码,只是对问题的简单修复。