C# Написать изображение в ziparchive
Я пишу приложение WinForms для C# .NET(v4.6.1), которое сохранит файл как System.IO.Compression.ZipArchive. Сначала я открываю изображение с помощью метода SaveFileDialog(), а затем назначаю его переменной типа System.Drawing.Image. Затем я сохраняю файл, начинаю со строк, целых чисел и логических значений, переходящих в текстовый файл. Далее я пытаюсь сохранить изображение из переменной, а не из исходного пути к файлу на жестком диске. Вот код для сохранения файла, текстовый файл с изображением:
public void SaveStd2Zip(string strfilepath, List<clsStandardQuestion> lstQuestions,
clsProjectInfo GameInfo, List<clsMedia> lstProjMed)
{
using (var ms = new MemoryStream())
{
using (var archive = new ZipArchive(ms, ZipArchiveMode.Create, true))
{
var projectInfo = archive.CreateEntry("ProjectInfo.txt");
using (var entryStream = projectInfo.Open())
using (var sw = new StreamWriter(entryStream))
{
sw.WriteLine(GameInfo.strGameVersion);
sw.WriteLine(GameInfo.strProjectType);
sw.WriteLine(GameInfo.strGameTitle);
sw.WriteLine(GameInfo.strAuthor);
sw.WriteLine(GameInfo.strCreationDate);
sw.WriteLine(GameInfo.blTSImagePresent);
sw.WriteLine(GameInfo.blTSAudioPresent);
sw.WriteLine(GameInfo.blTSVideoPresent);
sw.WriteLine(GameInfo.blFSSImagePresent);
sw.WriteLine(GameInfo.blFSSAudioPresent);
sw.WriteLine(GameInfo.blFSSVideoPresent);
sw.WriteLine(GameInfo.intTotalQuestions);
sw.WriteLine(GameInfo.intTotalMediaItems);
sw.WriteLine(GameInfo.intTotalCategories);
sw.WriteLine(GameInfo.blTiebreakerPresent);
if (GameInfo.intTotalQuestions > 0)
{
for (int i = 0; i > lstQuestions.Count; i++)
{
sw.WriteLine(lstQuestions[i].blIsTiebreaker);
sw.WriteLine(lstQuestions[i].strQuestion);
sw.WriteLine(lstQuestions[i].intPoints);
sw.WriteLine(lstQuestions[i].intQuestionType);
sw.WriteLine(lstQuestions[i].blQuestionImagePresent);
sw.WriteLine(lstQuestions[i].blQuestionAudioPresent);
sw.WriteLine(lstQuestions[i].blQuestionVideoPresent);
sw.WriteLine(lstQuestions[i].blIncludeTimer);
sw.WriteLine(lstQuestions[i].intTimerTime);
// Multiple Choice variables...
sw.WriteLine(lstQuestions[i].blAIsChecked);
sw.WriteLine(lstQuestions[i].strAnswerA);
sw.WriteLine(lstQuestions[i].blAIsCorrect);
sw.WriteLine(lstQuestions[i].blBIsChecked);
sw.WriteLine(lstQuestions[i].strAnswerB);
sw.WriteLine(lstQuestions[i].blBIsCorrect);
sw.WriteLine(lstQuestions[i].blCIsChecked);
sw.WriteLine(lstQuestions[i].strAnswerC);
sw.WriteLine(lstQuestions[i].blCIsCorrect);
sw.WriteLine(lstQuestions[i].blDIsChecked);
sw.WriteLine(lstQuestions[i].strAnswerD);
sw.WriteLine(lstQuestions[i].blDIsCorrect);
// True Or False variables...
sw.WriteLine(lstQuestions[i].blTrueOrFalseAnswer);
// Fill-In-The-Blank variables...
sw.WriteLine(lstQuestions[i].strFIBAnswer);
// Answer Response variables...
sw.WriteLine(lstQuestions[i].strIAR);
sw.WriteLine(lstQuestions[i].strIAR);
sw.WriteLine(lstQuestions[i].blIARImagePresent);
sw.WriteLine(lstQuestions[i].blCARAudioPresent);
sw.WriteLine(lstQuestions[i].blCARVideoPresent);
sw.WriteLine(lstQuestions[i].blIARImagePresent);
sw.WriteLine(lstQuestions[i].blIARAudioPresent);
sw.WriteLine(lstQuestions[i].blIARVideoPresent);
}
}
sw.Close();
}
//Now write the image...
if (GameInfo.blTSImagePresent == true)
{
var TSImage = archive.CreateEntry("imgTSImage");
using (var entryStream = TSImage.Open())
using (var sw = new StreamWriter(entryStream))
{
clsMediaConverter MC = new clsMediaConverter();
sw.Write(GameInfo.imgTSImage.ToString());
sw.Close();
}
}
}
using (var fileStream = new FileStream(strfilepath, FileMode.Create))
{
ms.Seek(0, SeekOrigin.Begin);
ms.CopyTo(fileStream);
}
}
}
Проблема: изображение не сохраняется. Я открываю полученный zip-файл в 7zip и пытаюсь открыть изображение в веб-браузере, и все, что я получил, это "System.Drawing.Image". Можно ли таким образом сохранить изображение в zip-архиве? Если нет, то как я могу это сделать, не записывая файл образа из исходного расположения на жестком диске?
1 ответ
Вы используете потоковую запись, которая пишет только текст, вам нужно сохранить изображение, а не имя класса:
//Now write the image...
if (GameInfo.blTSImagePresent == true)
{
var TSImage = archive.CreateEntry("imgTSImage");
using (var entryStream = TSImage.Open())
{
GameInfo.imgTSImage.Save(entryStream, ImageFormat.Jpeg);
}
}