C #: Получение ошибки: «Произошла общая ошибка в GDI +» При попытке скопировать imagebox.Image в поток памяти.Этот поток не сохраняется в файл. - PullRequest
2 голосов
/ 28 апреля 2011

Я получаю странную ошибку с Image.save(Stream, Format).

Я попытался найти решение, но все, кажется, считают, что ошибка связана с правами доступа к файлам.Это не может быть в моем случае, если поток не попадает в файл.Мой код ниже:

MemoryStream Stream = new MemoryStream();
this.Image_Box_1.Image.Save(Stream, System.Drawing.Imaging.ImageFormat.Jpeg);
TI.AlbumCover = Stream.ToArray();
Stream.Close();

TI.AlbumCover является byte[].

Кто-нибудь есть какие-либо идеи о том, что проблема может быть?

РЕДАКТИРОВАТЬ:

Хорошо, так что я решил это.Исходный файл может иногда приходить из файла jpg, иногда из байтового массива (часть тега id3).Проблема заключалась в том, что, когда изображение пришло из файла, я закрывал поток после создания изображения окна изображения.Хотя изображение оставалось видимым, данные больше не были доступны.

Поскольку мне позже понадобилось перезаписать этот jpg-файл, я не мог просто оставить файловый поток открытым, поэтому оставил остальную часть своего кода тем же.и изменил код для чтения из jpg следующим образом:

FileStream FS = new FileStream(File, FileMode.Open, FileAccess.Read);//Read in the jpg file
Image IMG = Image.FromStream(FS);//Create an image from the file data
MemoryStream MS = new MemoryStream();
IMG.Save(MS, System.Drawing.Imaging.ImageFormat.Jpeg);//Save the image data to a memory stream
byte[] temp = MS.ToArray();//Copy the image data to a byte array
//close the streams
MS.Close(); 
FS.Close();
return temp; //was originally returning an image

Затем, после выполнения этого кода, я изменяю код, который поместил изображение в поле изображения:

try
{
    if (this.m_V2Tag.AlbumCover != null)
        this.Image_Box_1.Image = Image.FromStream(new MemoryStream(this.m_V2Tag.AlbumCover));
    //changed code
    else
    {
        MemoryStream temp = new MemoryStream(this.getFolderJpg()); //create a memory stream from the byte[]. This stream can safely be left open.
        this.Image_Box_1.Image = Image.FromStream(temp); // create image and assign it to the image box
    }
}
catch
{
    this.Image_Box_1.Image = null;
}
...