gpt4 book ai didi

c# - 位图.Save "Generic Error"

转载 作者:可可西里 更新时间:2023-11-01 14:41:25 27 4
gpt4 key购买 nike

当我运行我的应用程序时,出现以下错误“GDI+ 中发生一般性错误。”我环顾四周,看到人们有类似的错误,但没有找到真正的解决方案,或者实现起来真的很痛苦。那些没有得到解决方案的人也没有发布他们的代码。

所以我想我不妨试一试,并提出另一个关于如何修复此错误的话题。这是我的代码和错误

            Random r = new Random();
DirectoryInfo di = new DirectoryInfo(folderbrowser.SelectedPath);
FileInfo[] fi = di.GetFiles().Where(f => extensions.Contains(f.Extension.ToLower())).ToArray();
for (int i = 0; i < imageCount; i++)
{
int img1 = r.Next(imageCount);
int img2 = r.Next(imageCount);
while (img2 == img1)
img2 = r.Next(imageCount);
pic1.Image = Image.FromFile(fi[img1].FullName);
pic2.Image = Image.FromFile(fi[img2].FullName);
Image i1 = pic1.Image;
Image i2 = pic2.Image;
Bitmap bitmap = new Bitmap(i1.Width + i2.Width, 1080);
using (Graphics g = Graphics.FromImage(bitmap))
{
g.DrawImage(i1, 0, 0);
g.DrawImage(i2, i2.Width, 0);
}
bitmap.Save(@"C:\TEST\Image_"+i.ToString());
}

这是错误代码

System.Runtime.InteropServices.ExternalException was unhandled
Message=A generic error occurred in GDI+.
Source=System.Drawing
ErrorCode=-2147467259
StackTrace:
at System.Drawing.Image.Save(String filename, ImageCodecInfo encoder, EncoderParameters encoderParams)
at System.Drawing.Image.Save(String filename, ImageFormat format)
at System.Drawing.Image.Save(String filename)
at WallpaperMerger.Form1.btn_merge_Click(Object sender, EventArgs e) in C:\Users\PeppeJ\documents\visual studio 2010\Projects\WallpaperMerger\WallpaperMerger\Form1.cs:line 113
at System.Windows.Forms.Control.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ButtonBase.WndProc(Message& m)
at System.Windows.Forms.Button.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.Run(Form mainForm)
at WallpaperMerger.Program.Main() in C:\Users\PeppeJ\documents\visual studio 2010\Projects\WallpaperMerger\WallpaperMerger\Program.cs:line 18
at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
InnerException:

那么 StackOverflow 的各位怎么看?我是不是和其他人一样,不得不输入复杂得离谱的代码来解决这个问题,还是我犯了一个简单的错误而且很容易改正?

如果您想自己测试它是否有帮助,这里有一个指向 Debug Build 的链接

只需勾选“使用多个文件”,例如选择包含图像文件的文件夹(C:\Users\Public\Pictures\Sample Pictures)。点击合并。

我想补充一点,我在此函数中使用了 Bitmap.Save,并且它完美地工作。

        Bitmap bitmap = new Bitmap(pic1.Image.Width + pic2.Image.Width, 1080);
using (Graphics g = Graphics.FromImage(bitmap))
{
g.DrawImage(pic1.Image, 0, 0);
g.DrawImage(pic2.Image, pic1.Image.Width, 0);
}
if (savepicfile.ShowDialog() == DialogResult.OK)
bitmap.Save(savepicfile.FileName);

在上面的函数中,文件是这样加载的:

    DialogResult result = pic1file.ShowDialog();
if (result == DialogResult.OK)
pic1.Image = Image.FromFile(pic1file.FileName);

另外值得一提的是“picX”是一个“System.Windows.Forms.PictureBox”对象。

最佳答案

根据我的经验,99% 的情况下此错误是由以下任一问题引起的:

  1. 您没有写入该文件的权限。
  2. 您尝试写入的文件已被另一个进程锁定。

偶尔我会遇到它:

  • 我正在绘制其中包含零点的 GraphicPaths。
  • 我没有处置我的 GDI+ 对象的属性(property)。 (可能与上面的选项 2 有关)

我会先检查前两件事。如果可以排除这种情况,我可以看到您在哪里没有正确处理您提供的代码中的一些对象。我会清理它。如果您没有在应该调用的时候调用 Dispose(),那么 GDI+ 与 .NET 的 GC 并不是特别合作。

        var r = new Random();
var di = new DirectoryInfo(folderbrowser.SelectedPath);
var fi = di.GetFiles().Where(f => extensions.Contains(f.Extension.ToLower())).ToArray();
for (var i = 0; i < imageCount; i++)
{
var img1 = r.Next(imageCount);
var img2 = r.Next(imageCount);
while (img2 == img1)
{
img2 = r.Next(imageCount);
}
pic1.Image = Image.FromFile(fi[img1].FullName);
pic2.Image = Image.FromFile(fi[img2].FullName);
var i1 = pic1.Image;
var i2 = pic2.Image;
using (var bitmap = new Bitmap(i1.Width + i2.Width, 1080))
using (var g = Graphics.FromImage(bitmap))
{
g.DrawImage(i1, 0, 0);
g.DrawImage(i2, i2.Width, 0);
bitmap.Save(@"C:\TEST\Image_"+i.ToString());
}
}

编辑:更多想法(好吧,确实澄清了上面的第 2 点)...

  • 如果您的应用程序中有 PictureBox 或其他控件引用您尝试编写的 C:\TEST 目录中的图像,您会看到此错误。
  • 如果您有其他代码读取您尝试写入的图像,您会看到此错误。
  • 如果外部进程(例如您的 IDE、图像查看器/编辑器等)打开了文件,您会看到此错误。

调试思路:

  • 尝试在 Save 调用上设置一个断点。当你找到它时,使用此处的提示找出可能正在访问该文件的进程:How do I find out which process is locking a file using .NET?
  • 先尝试只删除文件,如果文件不是他们的,是否允许您保存。
  • 尝试为您要写入的目录中的“所有人”设置完全权限(不过不要这样)
  • 确保您要保存的图像的宽度是一个大于零的数字。我注意到您正在以编程方式进行设置。
  • 确保您要保存的图像的宽度不会大到离谱(也许您遇到了内存问题?)

关于c# - 位图.Save "Generic Error",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13576806/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com