ConvertTo处发生一般GDI+错误

本文关键字:GDI+ 错误 ConvertTo | 更新日期: 2023-09-27 18:27:05

我正试图从映像创建一个字节数组,以便将数据存储在MySQL数据库中的blob中。没有必要告诉我Blob是一种糟糕的做法等,我们已经就在我们的情况下使用什么进行了讨论和争论,因为它只是一个小的图像文件,所以Blob是一条路。这是我的代码:

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

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

**编辑我尝试将图像存储在picturebox中,并从picturebox转换图像,但仍然会出现相同的错误。异常基本上是ObjectDisposedException,但我不会在代码中的任何位置处理它。如果它有帮助的话,它发生在我正在使用的所有图像上,这些图像的大小是不同的

**编辑2过帐整套代码Bitmap resizedImage, original;我将这两个声明为任何方法之外的全局变量。在下面的代码中,我读取了原始图像,将其存储在位图中,并创建了一个新的调整大小的图像,以满足我的需求,同时保持纵横比。

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);
                }
            }
        }

当用户单击上传到DB按钮时,它会调用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;行代码是在错误发生后添加的,只是为了查看原始图像是否仍包含图像。确实如此。

**EDIT 3我找到了一个解决问题的方法,在转换为等字节数组之前创建了一个临时位图

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

或者我想我是这样做的,因为使用.Clone()偶尔会解决我以前的问题。问题是为什么?

ConvertTo处发生一般GDI+错误

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

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

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

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