今天在开发.net引用程序中,需要System.Drawing.Image.Save 创建图片,debug的时候程序一切正常,可是发布到IIS后缺提示出现“GDI+中发生一般性错误”的异常。
于是开始“摆渡”,并寻找到了解决办法:赋予 NETWORK SERVICE 帐户以写权限。
以下为晚上寻找到的资料:
在开发.NET应用中,使用 System.Drawing.Image.Save 方法而导致“GDI+ 中发生一般性错误”的发生,通常有以下三种原因:
1. 相应的帐户没有写权限。
解决方法:赋予 NETWORK SERVICE 帐户以写权限。
2. 指定的物理路径不存在。
解决方法:
在调用 Save 方法之前,先判断目录是否存在,若不存在,则创建。
if (!Directory.Exists(dirpath))
Directory.CreateDirectory(dirpath);
3. 保存的文件已存在并因某种原因被锁定。
解决方法:
重启IIS,解除锁定。并在代码中使用 using 语句,确保释放 Image 对象所使用的所有资源。
我遇到的情况:
在编写Chem.NET的时候要保存图片,我先用openFileDialog打开图片文件,然后用saveFileDialog保存文件时就出现了 “GDI+中发生一般性错误”,我当时就想到是打开的文件还没有释放出来,于是用openFileDialog1.Dispose()来释放,可是没有成功。同样从一个MemorySream 实例打开一个Image后,立即关闭了这个流,结果在Image.Save时也会发生这种错误。我“摆渡”了很久都是遇到和我一样问题的人,CSDN上面的同志也没有给出一个实用的答案。最后终于还是在微软的网站上找到了答案:(以下是官方解决办法)
症状
Bitmap 对象或一个 图像 对象从一个文件, 构造时该文件仍保留锁定对于对象的生存期。 因此, 无法更改图像并将其保存回它产生相同的文件。
替代方法
• 创建非索引映像。
• 创建索引映像。
这两种情况下, 原始 位图 上调用 Bitmap.Dispose() 方法删除该文件上锁或删除要求, 流或内存保持活动。
创建非索引图像
即使原始映像被索引格式中该方法要求新图像位于每像素 (超过 8 位 -) -, 非索引像素格式。 此变通方法使用 Graphics.DrawImage() 方法来将映像复制到新 位图 对象:
1. 构造从流、 从内存, 或从文件原始 位图 。
2. 创建新 位图 的相同大小, 带有是超过 8 位 - - 像素 (BPP) 每像素格式。
3. 使用 Graphics.FromImage() 方法以获取有关二 位图 Graphics 对象。
4. 用于 Graphics.DrawImage() 绘制首 位图 到二 位图 。
5. 用于 Graphics.Dispose() 处置是 图形 。
6. 用于 Bitmap.Dispose() 是首 位图 处置。
创建索引映像
此解决办法在索引格式创建一个 Bitmap 对象:
1. 构造从流、 从内存, 或从文件原始 位图 。
2. 创建新 位图 具有相同的大小和像素格式作为首 位图 。
3. 使用 Bitmap.LockBits() 方法来锁定整个图像对于两 Bitmap 对象以其本机像素格式。
4. 使用 Marshal.Copy 函数或其他内存复制函数来从首 位图 复制到二 位图 图像位。
5. 使用 Bitmap.UnlockBits() 方法可以解锁两 Bitmap 对象。
6. 用于 Bitmap.Dispose() 是首 位图 处置。
由于外国人的思维和我们不一样,我重新用实例解释一下,我这里使用的是创建非索引图像。
private void ToolStripMenuItem_Click(object sender, EventArgs e)
{
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
//创建一个bitmap类型的bmp变量来读取文件。
Bitmap bmp = new Bitmap(openFileDialog1 .FileName );
//新建第二个bitmap类型的bmp2变量,我这里是根据我的程序需要设置的。
Bitmap bmp2 = new Bitmap(1024, 768, PixelFormat.Format16bppRgb555);
//将第一个bmp拷贝到bmp2中
Graphics draw = Graphics.FromImage(bmp2);
draw.DrawImage(bmp,0,0);
pictureBox1.Image = (Image)bmp2 ;//读取bmp2到picturebox
FILE = openFileDialog1.FileName;
openFileDialog1.Dispose();
draw.Dispose();
bmp.Dispose();//释放bmp文件资源
}
}
通过以上的读取文件,在保存的时候就不会出现错误了。
本文来自: IT泡吧!(http://www.itpob.cn/bbs) 详细出处:http://www.itpob.cn/viewthread.php?tid=10502&extra=
分享到:
相关推荐
### GDI+中发生一般性错误的理解与处理 #### GDI+简介 GDI+(Graphics Device Interface Plus)是微软为Windows平台开发的一套绘图应用程序接口,它提供了丰富的图形和图像处理功能,如绘制线条、形状、图像,以及...
这种方法确保了在处理图像时不会锁定文件,从而解决了因资源未释放导致的“GDI+中发生一般性错误”。 接下来,我们可以进一步探讨如何在.NET中生成缩略图和添加水印。生成缩略图通常包括读取原图、计算缩放比例、...
5. **错误处理**:GDI+使用异常处理来报告错误,所以编写GDI+代码时,需要包裹在try-catch块中,以便捕获和处理可能出现的异常。 6. **性能与兼容性**:GDI+相比原生的GDI,提供了更好的图形质量和更高的性能,同时...
在使用.NET Framework进行Windows应用程序开发时,可能会遇到一个常见的错误提示:“A generic error occurred in GDI+”。这个异常通常在处理图像、图形或者打印任务时出现,涉及到GDI+(Graphics Device Interface...
9. **错误处理**:介绍在使用GDI++时可能遇到的问题以及解决方法。 10. **API参考**:列出GDI++的关键函数和类,包括它们的功能、参数和返回值,方便开发者查阅。 通过阅读这份“GDI++中文帮助.pdf”文档,开发者...
Visual C++6.0使用GDI+的一般方法 1. 载解压GDI+开发包; 2. 正确设置include & lib 目录; 3. stdafx.h 添加: #ifndef ULONG_PTR #define ULONG_PTR unsigned long* #endif #include 或者 将Visual...
GDI+提供了多种错误校验机制,用于检测图形应用程序中的错误。开发者需要了解如何进行错误校验,避免图形应用程序的崩溃。 线程同步: GDI+提供了多种线程同步机制,用于确保图形应用程序的线程安全。开发者需要...
GDI+的安全考虑包括检验构造函数调用的成功与否、分配缓冲区的注意事项以及错误校验和线程同步等。这是因为在进行图形编程时,如果不注意这些细节,可能会导致内存泄漏、程序崩溃甚至安全漏洞。 关于GDI+的介绍部分...
总的来说,GDI+是Windows编程中不可或缺的工具,它的出现极大地扩展了开发者在图形处理方面的可能性,使得创建复杂的图形效果变得更加简便。通过理解和掌握GDI+的这些核心概念和技术,开发者能够构建出更加精美、...
2. **初始化GDI+**:在VB6中使用GDI+之前,必须对GDI+进行初始化,这通常通过调用`GdipStartup`函数来完成。初始化完成后,可以开始使用GDI+的各种功能。 3. **创建Graphics对象**:Graphics对象是GDI+的核心,...
GDI+(Graphics Device Interface Plus)是微软Windows操作系统中用于图形设备接口的增强版本,它为开发者提供了一套丰富的绘图工具,使得在Windows应用程序中创建、管理和显示图形变得更加便捷和高效。GDI+不仅继承...
总之,《GDI+程序设计》是一本内容全面、结构清晰、实用性强的技术图书,是中高级C#程序员学习和应用GDI+技术的优秀参考资料。通过阅读和实践本书中的内容,开发者能够有效提升自己在图形编程领域的专业技能,掌握...
GDI+开发的帮助文档,讲得清晰浅显,而且是中文的.如果学习GDI+开发的话,特别是初学者,强烈推荐下载. 对于初学者,还有一个问题就是,如果想要进行GDI+开发, 需要下载一个GDI+的开发包(SDK). 网上搜到的一般只包含一个...
GDI+(Graphics Device Interface Plus)是Windows操作系统中用于图形绘制和图像处理的一个强大的API,它是GDI(Graphics Device Interface)的升级版本。GDI+提供了丰富的绘图功能,包括二维几何图形、曲线、文本、...
本书是一本为.NET开发人员讲授如何编写Windows和Web图形应用程序的专著,书中全面介绍了GDI+和Windows图形程序设计的基本知识和GDI+图形程序设计的各个方面。 本书适合于开发GDI+图形应用程序的初、中级程序员...
在VB6(Visual Basic 6)环境中,GDI+(Graphics Device Interface Plus)是一个强大的图形绘制和处理库,它极大地扩展了VB6的图形能力。本经典GDI+模块是VB6开发者的一个宝贵资源,提供了丰富的图形操作功能,如...