分类
标签
.NET 9008 adb android apt asp.net ASP.NET Core audio bug C c++ C++ chrome cmd csharp CSharp css css3 debian debug dotnet dotnet Framework dpkg GDI&GDI+ gdi&gdi+ golang graphics html html5 http java javascript json kali linux linux mci microsoft minimap MSBuild mysql OpenCV PInvoke powershell python QQ rust shell speex sql tutorial ubuntu ui unity vb.net visual studio Visual Studio web Web win32 winapi windows winform WinForm wpf WPF xaml xfce 列表 刷机 前端 加密 反射 反编译 可视化 图像处理 多线程 字符串 安卓 实例 局域网 幻影坦克 库 开发语言 异步 微信 手册 手机 接口 摘要 救砖 数字签名 数字证书 数字音频 数据库 桌面程序 游戏 游戏引擎 源码 爬虫 玩游戏 电脑硬件 笔记 算法 类库 线性代数 编程语言 网络 脚本语言 计算机图形学 计算机基础 设计模式 语音编解码 运维 进制 面向对象编程 音频 音频编码解码
676 字
3 分钟
记录一次经验:Image.Save遇到A generic error occurred in GDI+异常
要点:
- 先看自己路径是不是错了
- 然后看自己的路径表达是不是不符合标准, 例如这样的”/ewq_00010.png”, 它指向C:\根目录下的一个文件! 而.NET中一般不允许对那里进行写操作
- 然后, 我就是在上述内容的情况上犯了错… “/ewq_00010.png”应该是”./ewq_00010.png”, 使用这个点来表示, 它是一个相对路径
我的解决过程
- Image 保存的Path是”/ewq_00010.png”
- 在发现这个问题后, 我首先是检查了一下, 我写的路径是否是正确的, 比如, 目录是否存在, 我使用VS的调试功能, 测试了一下, Directory.Exists(Path.GetDirectoryName(“/ewq_00010.png”)) 结果是true, 初步判断不是路径问题
- 后来查资料, 发现可能是这个Image是FromFile生成的而报错, 但我的不是, 它完完全全是一个new出来的, 我又尝试性地指定ImageFormat.Png, 果然, 问题没有解决
- 继续查资料, 发现有人使用FileStream解决了问题, 我也尝试, 然后失败了… 写入被拒绝, 查了查资料, 为什么FileStream写入被拒绝, 一堆乱七八糟的东西, 看都看不懂, 大概就是讲ASP.NET不能在C:\写入, 但是我又不是ASP.NET
- 然后我尝试转个弯子, 用MemoryStream, 然后最后用File.WriteAllBytes写入试试, 最后, 我突然发现, 它提示我, 对C:/的写入被拒绝, 蛤??? 我的路径不是”/ewq_0010.png”吗??? 我脑子跟Linux联想了起来, 总不会… 单个斜杠指C:/吧?
这个输出路径, 其实是经过我的一个PathCombine函数拼合而成的路径, 它很简单, 但也因为它的判断很简单而嗝屁了
public static string CombinePath(string path1, string path2) // 简单粗暴路径拼合
{
if (path2.Contains(':'))
{
throw new ArgumentException("第二个路径不可是绝对路径");
}
return path1.TrimEnd(new char[] { '/', '\\' }).Replace('\\', '/') + "/" + path2.TrimStart(new char[] { '/', '\\' }).Replace('\\', '/');
}
- 然后我把这个函数改成了这样:
public static string CombinePath(string path1, string path2)
{
if (path2.Contains(':'))
{
throw new ArgumentException("第二个路径不可是绝对路径");
}
string result = path1.TrimEnd(new char[] { '/', '\\' }).Replace('\\', '/') + "/" + path2.TrimStart(new char[] { '/', '\\' }).Replace('\\', '/');
if (result.Contains(':')) // 简单粗暴判断你是否是绝对路径
{
return result; // 如果是绝对路径就直接返回, 也不管他是否是对的
}
else
{
return "./" + result.Trim('/'); // 如果不是, 则加一个"./"来强调, '我这是相对路径'
}
}
- 然后… 程序成功跑起来了…
最后, 这个程序是用于根据atlas图像索引表分解图像的, 如果你觉得有参考价值, 可以私信我
记录一次经验:Image.Save遇到A generic error occurred in GDI+异常
https://slimenull.com/posts/20200826215919/