我正在尝试从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()
偶尔解决了我的问题。
问题是为什么?
答案 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