Image.Save(..)抛出内存流打开的GDI +异常

时间:2013-11-25 11:18:07

标签: c# 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();
      }

}

我尝试使用和不使用处理图像,它对错误没有任何影响。 如果您想要所述数据库here的样本,那就是。

这是方法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;
    }

注意:此问题尚未解决。

0 个答案:

没有答案