另一个 "A generic error occurred in GDI+." -问题
Another "A generic error occurred in GDI+." -Question
好吧,我用谷歌搜索了这个问题,也在 Whosebug 中搜索了这里,但我找不到解决方案,太多了,但它是一个简单的解决方案。我从数据库加载图像并将它们保存为 JPG localy 在目录中。大多数图像都能正常工作并正确保存,但有些图像会出现“GDI+ 中发生一般性错误”-错误。
这是我的代码:
using (var encoderPara = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, Qual))
using (var paras = new EncoderParameters(1))
using (var conn = new SqlConnection(conn_str))
using (var cmd = new SqlCommand(cmd_str,conn))
{
paras.Param[0] = encoderPara;
conn.Open();
using (var reader = cmd.ExecuteReader())
while (reader.Read())
if (!reader.IsDBNull(reader.GetOrdinal("Image")))
{
var img = $"{reader["Order"]}_{reader["SubOrder"]}.jpg";
var P = Path.Combine(BasePath, img);
if (!File.Exists(P))
try
{
using (var MS = new MemoryStream((byte[])reader["Image"]))
using (var Img = Image.FromStream(MS))
using (var ImgJPG = new Bitmap(Img.Width, Img.Height))
using (var g = Graphics.FromImage(ImgJPG))
{
g.Clear(Color.White);
g.DrawImage(Img, new Point(0, 0));
ImgJPG.Save(P, JPG_Encoder, paras);
WriteinLog($"Image created: {P}");
}
}
catch (Exception ex)
{
WriteinLog(string.Format("{1}{0}{0}{2}{0}{0}{3}{0}{0}{4}{0}{0}{5}{0}{0}{6}", Environment.NewLine, $"Error {img}", ex.GetType().FullName, ex.Message, ex.Source, ex.StackTrace, ex.TargetSite));
}
}
}
我认为错误出在最里面的 using 块中,因为它似乎毫无问题地到达那里。所以我删除了使用并尝试按原样保存图像,但仍然出现 GDI+ 错误。
然后看起来像这样:
var MS = new MemoryStream((byte[])reader["Meta"]);
var Img = Image.FromStream(MS);
{
Img.Save(P);
WriteinLog($"Image created: {P}");
}
我的主要问题是,它适用于大多数图像,只有一些是例外,但如果它在编解码器错误的地方会更快触发错误。不可能是 MS 或 Image 被处理掉,因为它们一起在 using 块中,我试图删除 usings。不可能是文件存在并且正在使用中,因为我会检查它。
好的,我写了最后一句话“不可能是文件存在并且正在使用,因为我会检查它。”并意识到并非所有子订单号都是数据库中的数字,因此用递增的整数替换文件名并且它有效。
因此,“GDI+ 中发生一般性错误”- 路径错误时出现错误。很高兴知道并留意。
我已经写完了所有这些,所以我 post 将答案附上,感谢您关注我的 Rubber-Ducky,并希望它对其他人有所帮助。
好吧,我用谷歌搜索了这个问题,也在 Whosebug 中搜索了这里,但我找不到解决方案,太多了,但它是一个简单的解决方案。我从数据库加载图像并将它们保存为 JPG localy 在目录中。大多数图像都能正常工作并正确保存,但有些图像会出现“GDI+ 中发生一般性错误”-错误。
这是我的代码:
using (var encoderPara = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, Qual))
using (var paras = new EncoderParameters(1))
using (var conn = new SqlConnection(conn_str))
using (var cmd = new SqlCommand(cmd_str,conn))
{
paras.Param[0] = encoderPara;
conn.Open();
using (var reader = cmd.ExecuteReader())
while (reader.Read())
if (!reader.IsDBNull(reader.GetOrdinal("Image")))
{
var img = $"{reader["Order"]}_{reader["SubOrder"]}.jpg";
var P = Path.Combine(BasePath, img);
if (!File.Exists(P))
try
{
using (var MS = new MemoryStream((byte[])reader["Image"]))
using (var Img = Image.FromStream(MS))
using (var ImgJPG = new Bitmap(Img.Width, Img.Height))
using (var g = Graphics.FromImage(ImgJPG))
{
g.Clear(Color.White);
g.DrawImage(Img, new Point(0, 0));
ImgJPG.Save(P, JPG_Encoder, paras);
WriteinLog($"Image created: {P}");
}
}
catch (Exception ex)
{
WriteinLog(string.Format("{1}{0}{0}{2}{0}{0}{3}{0}{0}{4}{0}{0}{5}{0}{0}{6}", Environment.NewLine, $"Error {img}", ex.GetType().FullName, ex.Message, ex.Source, ex.StackTrace, ex.TargetSite));
}
}
}
我认为错误出在最里面的 using 块中,因为它似乎毫无问题地到达那里。所以我删除了使用并尝试按原样保存图像,但仍然出现 GDI+ 错误。
然后看起来像这样:
var MS = new MemoryStream((byte[])reader["Meta"]);
var Img = Image.FromStream(MS);
{
Img.Save(P);
WriteinLog($"Image created: {P}");
}
我的主要问题是,它适用于大多数图像,只有一些是例外,但如果它在编解码器错误的地方会更快触发错误。不可能是 MS 或 Image 被处理掉,因为它们一起在 using 块中,我试图删除 usings。不可能是文件存在并且正在使用中,因为我会检查它。
好的,我写了最后一句话“不可能是文件存在并且正在使用,因为我会检查它。”并意识到并非所有子订单号都是数据库中的数字,因此用递增的整数替换文件名并且它有效。
因此,“GDI+ 中发生一般性错误”- 路径错误时出现错误。很高兴知道并留意。
我已经写完了所有这些,所以我 post 将答案附上,感谢您关注我的 Rubber-Ducky,并希望它对其他人有所帮助。