Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将内存中的位图保存到ZipArchive,而不首先将位图保存到文件系统?_C#_File_Bitmap_Ziparchive_In Memory - Fatal编程技术网

C# 如何将内存中的位图保存到ZipArchive,而不首先将位图保存到文件系统?

C# 如何将内存中的位图保存到ZipArchive,而不首先将位图保存到文件系统?,c#,file,bitmap,ziparchive,in-memory,C#,File,Bitmap,Ziparchive,In Memory,因此,我有一些代码可以捕获屏幕并将其保存到jpeg文件中。这很好,但是我想将jpeg编码的捕获保存到一个新的ZipArchive中,而不首先将位图写入文件系统 以下是我到目前为止的情况: FileInfo zipArchive = new FileInfo(fileToZip.FullName + ".zip"); using (ZipArchive zipFile = ZipFile.Open(zipArchive.FullName, ZipArchiveMode.Create))) {

因此,我有一些代码可以捕获屏幕并将其保存到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()
行上抛出了一个
系统.NotSupportedException

来自ZipArchiveEntry的此流不支持查找


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

许多文件格式都有指向文件其他部分的指针或长度值,这些内容可能事先不知道。最简单的方法是先写零,然后写数据,然后试图改变值。如果使用这种方式,就没有办法解决这个问题,因此您需要首先将数据写入
内存流
,然后将结果数据写入
ZipStream
,如您所述


这实际上并没有添加太多代码,只是一个简单的问题解决方案。

感谢您提供有关文件内指针/长度的提示,以及这将如何添加查找要求,我没有想到这一点。我开始尝试使用一个临时内存流将位图保存到zipStream,然后复制到zipStream,一切看起来都正常,但结果是:它创建了一个包含图像文件的zip文件,但图像文件是空的。我尝试手动刷新temp MemoryStream,然后刷新zipStream,但也没有任何效果。我至少觉得我现在正在写东西,所以谢谢!。发布此消息5分钟后,我让它工作了,但在调用bmp.Save()之后,我忘记了返回到tmpSteam的开头。谢谢,我想我一直都有答案,但我觉得我已经习惯了很多流。