【问题标题】:"Parameter is invalid" when creating a new bitmap pointing to a filepath创建指向文件路径的新位图时“参数无效”
【发布时间】:2019-10-17 12:39:51
【问题描述】:

当我尝试创建新的位图图像以传递给方法时,我遇到了这个奇怪的问题。 异常发生在

位图 bm = new bitmap("images/cat.jpg");

我尝试使用各种大小的各种图像来尝试测试是否是文件大小问题,但结果表明项目中只有 1 个现有图像可以工作(这是一张猫的照片)。

所有其他图像都返回错误“参数无效”。我尝试重建项目并允许读取权限,但我仍然无法让它工作。

System.ArgumentException was unhandled
  HResult=-2147024809
  Message=Parameter is not valid.
  Source=System.Drawing
  StackTrace:
       at System.Drawing.Bitmap..ctor(String filename)
       at Image_Authentication_Final.RegistrationForm.btnRegister_Click(Object sender, EventArgs e) in c:\Users\Acc\Desktop\Image Authentication Final\Image Authentication Final\RegistrationForm.cs:line 176
       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 MetroFramework.Controls.MetroButton.OnMouseUp(MouseEventArgs e)
       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 Image_Authentication_Final.Program.Main() in c:\Users\Acc\Desktop\Image Authentication Final\Image Authentication Final\Program.cs:line 19
       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.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ThreadHelper.ThreadStart()
  InnerException: 

【问题讨论】:

  • @dbc 刚试了下,完全不行……
  • 刚刚尝试使用完全相同的图像,复制它并将第二个副本重命名为 cat2.jpg.. 如果我将该图像放入位图中,它会返回错误,这是什么?!跨度>
  • Bitmap bmp = new Bitmap("images/cat.jpg"); 是您在创建位图时所做的一切,还是您正在使用未显示的其他参数?
  • 您是否可以将其中一张在 zip 中无法使用的图片上传到 sendspace 之类的?

标签: c# windows bitmap desktop


【解决方案1】:
  • 尝试使用双反斜杠的图像文件的完全限定路径(“C:\test\abc.jpg”)
  • 判断 jpeg 文件是否对 .net 的图像编解码器有效
    • 在 MS Paint 中创建 jpeg
    • 在 Gimp、Photoshop 中创建 jpeg ...
    • 使用 imagemagick 将 jpeg 从 jpeg 转换为 png,然后再转换回 jpeg
    • 使用 jpegtran 优化 jpeg 以强制重写 jpeg 标头
  • 使用 imagemagick 的标识或 gimp 来确定 jpeg 中的内容(可能是不同的图像文件格式或 jpeg 2000)
  • 在 .net 代码中,使用 File 或 FileInfo 调用来验证文件是否存在、长度非零且可访问

如果文件位于网络驱动器上并且刚刚被写入,则即使文件的创建者关闭了文件,也可能需要一两秒才能从独占使用中释放文件。

【讨论】:

  • 感谢您的输入,幸运的是 imagemagick 是我项目中的现有库,我实际上尝试获取图像信息(没有实际转换)但仍然无济于事。
【解决方案2】:

忘记添加了。 .NET 在处理位图和图像方面出了名的古怪,需要释放或处置图像资源。重复执行图像操作而不释放它们会导致问题。

在进程资源管理器中检查进程的句柄数。

对于用于图像处理的服务器端甚至桌面应用程序,我已将图像写入磁盘,然后运行 ​​imagemagick.exe 命令行来处理图像并等待图像文件输出被写入。它允许 imagemagick 在一个进程中启动、执行图像操作和退出所有操作,而不会阻塞 .net 的内存或句柄。

【讨论】:

    猜你喜欢
    • 2011-11-30
    • 1970-01-01
    • 2011-09-14
    • 1970-01-01
    • 2020-07-09
    • 2019-08-07
    • 2015-04-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多