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()
偶尔会解决我以前的问题。问题是为什么?
您可能需要克隆位图并使用它:
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