Image.Save(..) выдает исключение GDI+ с открытым потоком памяти

Я пытаюсь извлечь изображения из базы данных MS Access и сохранить их в папку, но получаю эту ошибку при сохранении изображений.

Я проверил другие сообщения повсюду, и проблема обычно заключается в том, чтобы не использовать поток памяти или закрыть его перед сохранением или необходимостью создания нового экземпляра изображения из-за того, что оно используется в другом месте. В моей проблеме есть все, что охвачено, и все еще выдается ошибка, и самое странное, что она работает до определенного момента. Первые 5 изображений сохраняются в папку, но 6-е дает эту ошибку, и если я перехожу к 6-му, 7-е сохраняется, но 8-е снова дает эту ошибку.

cmdIn.Connection = con;
cmdIn.CommandText = "SELECT [ID], [FOTO], [Designação Equipamento], [MARCA], [MODELO] FROM [Fotografias e Manuais de Equipamentos]";
OleDbDataReader rdr = cmdIn.ExecuteReader();
while (rdr.Read())
{
     int id = Convert.ToInt32(rdr["ID"]);
     string nome="";
     if (rdr["Designação Equipamento"].ToString().Equals(""))
     {
         nome = "semNome";
     }
     else
     {
         nome = rdr["Designação Equipamento"].ToString();
     }

     string nomeImagem = id + "_" + rdr["MARCA"].ToString() + "_" + rdr["MODELO"].ToString() + "_" + nome;
     lblStatus.Text = string.Format("Processing ID {0}...", id);
     lblStatus.Refresh();
     byte[] b = (byte[])rdr["FOTO"];
     byte[] imageBytes = OleImageUnwrap.GetImageBytesFromOLEField(b, 1000000);
     using (MemoryStream msIn = new MemoryStream((byte[])rdr["FOTO"]))
     {
         Image img = Image.FromStream(msIn);
         // The error pops up here in the save
         img.Save(saveImagePath + nomeImagem + ".png", System.Drawing.Imaging.ImageFormat.Png);
         //img.Dispose();
      }

}

Я пробовал с удалением изображения и без него, это не имеет значения для ошибки. Если вам нужен образец указанной базы данных, вот.

А вот метод GetImageBytesFromOLEField():

    public static byte[] GetImageBytesFromOLEField(byte[] oleFieldBytes, int NumMaximoBytesSearch)
    {
        //ref http://stackoverflow.com/questions/19688641/convert-ole-object-in-datarow-into-byte-c-sharp
        // adapted from http://blogs.msdn.com/b/pranab/archive/2008/07/15/removing-ole-header-from-images-stored-in-ms-access-db-as-ole-object.aspx

        int MaxNumberOfBytesToSearch = NumMaximoBytesSearch;
        byte[] imageBytes;  // return value

        var ImageSignatures = new List<byte[]>();
        // JPG_ID_BLOCK = "\u00FF\u00D8\u00FF"
        ImageSignatures.Add(new byte[] { 0xFF, 0xD8, 0xFF });
        // PNG_ID_BLOCK = "\u0089PNG\r\n\u001a\n"
        ImageSignatures.Add(new byte[] { 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A });
        // GIF_ID_BLOCK = "GIF8"
        ImageSignatures.Add(new byte[] { 0x47, 0x49, 0x46, 0x38 });
        // TIFF_ID_BLOCK = "II*\u0000"
        ImageSignatures.Add(new byte[] { 0x49, 0x49, 0x2A, 0x00 });
        // BITMAP_ID_BLOCK = "BM"
        ImageSignatures.Add(new byte[] { 0x42, 0x4D });

        int NumberOfBytesToSearch = (oleFieldBytes.Count() < MaxNumberOfBytesToSearch ? oleFieldBytes.Count() : MaxNumberOfBytesToSearch);
        var startingBytes = new byte[NumberOfBytesToSearch];
        Array.Copy(oleFieldBytes, startingBytes, NumberOfBytesToSearch);

        var positions = new List<int>();
        foreach (byte[] BlockSignature in ImageSignatures)
        {
            positions = IndexOfSequence(startingBytes, BlockSignature, 0);
            if (positions.Count > 0)
            {
                break;
            }
        }
        int iPos = -1;
        if (positions.Count > 0)
        {
            iPos = positions[0];
        }

        if (iPos == -1)
            throw new Exception("Unable to determine header size for the OLE Object");

        imageBytes = new byte[oleFieldBytes.LongLength - iPos];
        System.IO.MemoryStream ms = new System.IO.MemoryStream();
        ms.Write(oleFieldBytes, iPos, oleFieldBytes.Length - iPos);
        imageBytes = ms.ToArray();
        ms.Close();
        ms.Dispose();
        return imageBytes;
    }

Примечание. Эта проблема еще не решена.


person Micael Florêncio    schedule 25.11.2013    source источник
comment
Кажется, это связано с конкретным изображением или его типом изображения. Я помню, у меня были похожие проблемы с форматом изображения GIF: может быть, это ваш случай?   -  person LittleSweetSeas    schedule 25.11.2013
comment
@LittleSweetSeas Я точно знаю, что все они в формате PNG.   -  person Micael Florêncio    schedule 25.11.2013
comment
Куда вы утилизируете OleDbDataReader rdr? Или задокументировано, что он реализует IDisposable черт возьми? Повторите для cmdIn и con.   -  person ta.speot.is    schedule 25.11.2013
comment
возможный дубликат Внешнее исключение в ошибке GDI+ при сохранении определенного изображения   -  person Hans Passant    schedule 25.11.2013
comment
@HansPassant Код сильно отличается, и проблема, обнаруженная Гордом Томпсоном, была решена.   -  person Micael Florêncio    schedule 25.11.2013
comment
Каждый предположит, что с GetImageBytesFromOLEField() что-то не так, даже если не на что посмотреть. Вам нужно пометить сообщение, которое решило вашу проблему как ответ, вы этого не сделали.   -  person Hans Passant    schedule 25.11.2013