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);
我想用 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);