ConvertTo发生了一般GDI +错误

时间:2014-10-20 11:39:38

标签: c# winforms bitmap

我正在尝试从Image创建一个字节数组,以便将数据存储在MySQL数据库的blob中。 没有必要告诉我Blob是一个糟糕的做法等我们已经谈过并争论在我们的情况下使用什么,因为它只是一个小图像文件,然后Blob是要走的路。 这是我的代码:

ImageConverter converter = new ImageConverter();
byte[] byteImg = (byte[])converter.ConvertTo(original, typeof(byte[]));

我正在使用C#和Winforms。 我一直得到一个通用的gdi +错误,无法访问original位图图像。 为了检查这一点,我在ImageConverter行之前插入了一行代码,以在图片框中显示original位图,并且显示正确,所以我认为访问没有问题。 我在stackoverflow查找了所有可能的答案(并且它们很多)所有人都要求检查我是否处理了图像,是否不再有效等等。 我的代码中没有using,也没有处理图像。 original实际上是我想要访问的全局变量。

**编辑 我尝试将图像存储在图片框中并将其从图片框中转换出来,但仍然会出现相同的错误。 异常基本上是ObjectDisposedException但我没有在我的代码中的任何地方处理它。 如果它有助于它发生在我正在使用的所有大小不同的图像

**编辑2 发布完整的代码集 Bitmap resizedImage, original; 我将这两个声明为任何方法之外的全局变量。 在下面的代码中,我读取原始图像,将其存储在位图中,并创建一个符合我需要的新的Resized Image,同时保持宽高比。

private void imageResize()
        {
            if (string.IsNullOrWhiteSpace(imageLabel.Text))
            {
                flag = false;
                imageLabel.BackColor = Color.FromArgb(252, 240, 109);
            }
            else
            {
                try
                {

                    using (FileStream fs = new System.IO.FileStream(imageLabel.Text, System.IO.FileMode.Open))
                    {

                        original = new Bitmap(fs);
                    }

                    int rectHeight = 100;
                    int rectWidth = 112;
                    if (original.Height == original.Width)
                    {
                        resizedImage = new Bitmap(original, rectHeight, rectHeight);
                    }
                    else
                    {
                        float aspect = original.Width / (float)original.Height;
                        int newWidth, newHeight;
                        newWidth = (int)(rectWidth * aspect);
                        newHeight = (int)(newWidth / aspect);

                        if (newWidth > rectWidth || newHeight > rectHeight)
                        {
                            if (newWidth > newHeight)
                            {
                                newWidth = rectWidth;
                                newHeight = (int)(newWidth / aspect);

                            }
                            else
                            {
                                newHeight = rectHeight;
                                newWidth = (int)(newHeight * aspect);

                            }
                        }
                        resizedImage = new Bitmap(original, newWidth, newHeight);



                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Not supported file type " + ex.Message);
                }
            }
        }

当用户点击上传到数据库按钮时,它会调用imageResize方法,然后调用以下方法来发送数据。

private void saveData()
        {

            //code for reading rest of the data. 
            //Flag=false if something is wrong with it. Removed it as it has nothing to do
            // with the error. Only string types here
            if (flag)
            {
                DB.Image = original;
                MessageBox.Show("pause");
                MySqlConnection con = new MySqlConnection("server=127.0.0.1;database=testrmaomo;user id=root;password=root;persistsecurityinfo=True");
                con.Open();
                MySqlCommand cmd;
                //convert image to byte array
                ImageConverter converter = new ImageConverter();
                byte[] byteImg = (byte[])converter.ConvertTo(original.Clone(), typeof(byte[]));
                byte[] byteImgPrint = (byte[])converter.ConvertTo(resizedImage.Clone(), typeof(byte[]));

                //check if entry already exists in DB
                cmd = new MySqlCommand("SELECT count(*) FROM logopath;", con);
                StringBuilder sb = new StringBuilder();
               //check if the record exists. If it does update it if not insert it. 
              // Removed as it has nothing to do with the error
            }

在发生错误后添加了DB.Image=original;代码行,以查看原始代码是否仍然保留图像。确实如此。

**编辑3通过在转换为字节数组(例如

)之前创建临时位图,我找到了解决问题的方法
        ImageConverter converter = new ImageConverter();
        Bitmap tmp = new Bitmap(original);
        byte[] byteImg = (byte[])converter.ConvertTo(tmp.Clone(), typeof(byte[]));

或者我认为我之前使用.Clone()偶尔解决了我的问题。 问题是为什么?

2 个答案:

答案 0 :(得分:1)

您可能需要克隆位图并改为使用它:

byte[] byteImg = (byte[])converter.ConvertTo(original.Clone(), typeof(byte[]));

答案 1 :(得分:0)

您必须保持流打开。这对我有帮助。所以试试这个:

FileStream fs = new System.IO.FileStream(imageLabel.Text, System.IO.FileMode.Open))
original = new Bitmap(fs);

您还可以从Jon Skeet阅读以下答案: https://stackoverflow.com/a/336396

这可能对您的问题也很有趣: https://stackoverflow.com/a/1053123