C# 和 EmguCV:来自内存的 ZIP 图像

C# and EmguCV: ZIP image from memory

我想用 C# 将一组图像添加到 ZIP 文件。我使用 EmguCV 保存图像。目前我先将图像保存在本地,然后按如下方式添加到 ZIP 中。

有没有直接把图片直接添加到 ZIP 文件而不在本地保存的方法?

抱歉,如果这是重复的,我好几天都找不到明确的答案。

using (FileStream zipToOpen = new FileStream(this.path, FileMode.Create))
{
  using (ZipArchive zipArchive = new ZipArchive(zipToOpen, ZipArchiveMode.Update))
  {
    for (int i = 0; i < clouds.Count; i++)
    {
      string imageCname = kinectId + "_" + dateTimes[i] + ".jpg";
      imageCt = imageCs[i];
      imageCt.Save("imageCt.jpg");
      zipArchive.CreateEntryFromFile(@"imageCt.jpg", imageCname);
      Console.WriteLine("Flushing rgb " + i + " of " + clouds.Count);
    }
  }
}

更新 1:

根据#CarbineCoder 的建议,我按如下方式编辑了代码。它保存一个文件。但是不能作为图像打开。我猜,它只保存字节流。我还可以做些什么来将它保存为 jpeg 图片。

string imageCname = kinectId + "_" + dateTimes[i] + ".jpg";
imageCt = imageCs[i];
ZipArchiveEntry zipEntryC = zipArchive.CreateEntry(imageCname);

using (var originalFileStream = new MemoryStream(imageCt.Bytes))
{
  using (var zipEntryStream = zipEntryC.Open())
  {
    originalFileStream.CopyTo(zipEntryStream);
  }
}

你能post你改过的代码吗?

使用 zipArchive.CreateEntry() 中指定的解决方案-

Create zip file from byte[]

Creating a ZIP Archive in Memory Using System.IO.Compression

是的,您可能需要指定文件的扩展名,例如 zipArchive.CreateEntry("FileName.jpg")。这可能会解决您的问题

最终解决了 CarbineCoder 建议的问题。下面发布的是工作代码。

string imageCname = kinectId + "_" + dateTimes[i] + ".jpg";
imageCt = imageCs[i];

ZipArchiveEntry zipEntryC = zipArchive.CreateEntry(imageCname);

using (var stream = new MemoryStream())
{
  using (var zipEntryStream = zipEntryC.Open())
  {
    System.Drawing.Image userImage = imageCt.ToBitmap();
    userImage.Save(stream, ImageFormat.Jpeg);
    stream.Seek(0, SeekOrigin.Begin);
    stream.CopyTo(zipEntryStream);
  }
}
Console.WriteLine("Flushing rgb " + i + " of " + clouds.Count);