将字节数组转换为System.Drawing.Image时出错
本文关键字:Drawing Image 出错 System 字节 字节数 数组 转换 | 更新日期: 2023-09-27 18:11:39
我使用c# 4.5 Framework和MySql
MySqlDataReader reader = Command.ExecuteReader();
if (reader.Read())
{
byte[] ReturnImage = reader["Photo"] as byte[];
MemoryStream ms = new MemoryStream(ReturnImage);
Image Photo = Image.FromStream(ms); //Error is in this statement!!
}
当这个stmt被执行时,下面的错误显示"Parameter is not valid"
我在网上找不到答案。这里最可能的原因是longblob
的内容是而不是原始图像字节。要做的第一件事不是在兜圈子,而是:比较它们。例如,你说(注释)数据来自jpg文件,通过OpenFileDialog
。在这种情况下,比较它们。检查是否已成功存储和检索图像。
让我们假设所讨论的文件是c:'Some'Photo.jpg
-每个进程存储等。在这种情况下,您应该能够检查内容是否相同。在以下报告成功之前,所有的赌注都是无效的:
byte[] original = File.ReadAllBytes(@"c:'Some'Photo.jpg");
byte[] ReturnImage = reader["Photo"] as byte[];
if(Convert.ToBase64String(original) == Convert.ToBase64String(ReturnImage)) {
Console.WriteLine("Success; the contents match");
} else {
Console.WriteLine("Failure; the contents are different");
}
如果这报告"Failure;内容不一样",那么错误很可能出现在以下其中之一:
- 准备存储图像的代码(填充参数等)
- 执行 存储操作的存储过程。
- 从数据库取回图像的代码
如果这报告"Success;内容匹配":then"和,只有当时,查看试图加载Image
的代码才有意义。在这种情况下,假设c:'Some'Photo.jpg
加载了大多数其他图像加载工具("paint"等)-那么可能 Image
不识别子格式。但我猜它会说"失败;内容不同".
请注意,Convert.ToBase64String
在这里只是作为一种惰性的方式来检查二进制是否等价。您不会在生产代码中这样使用它,但它可以用于此目的。