我在ASP.NET 4.0中构建了一个动态图像大小调整Web应用程序,它使用IIS 7.5在Windows 2008 R2服务器上运行。
图像本身作为二进制最大字段存储在SQL 2008 R2数据库中(图像足够小,这是可行的,我们最初尝试了文件流选项,但它对我们的目的来说太慢了)
我查询数据库以将“blob”检索为字节数组并将其加载到图像对象中,如下所示:
Dim imageOriginal as Image = Nothing
Dim imageResized as Image = Nothing
imageOriginal = FindOriginalImage()
我需要做一些事情 - 如果它是PNG,我必须在白色画布上绘制它,或者如果我需要调整图像大小,我会得到一些非常疯狂的条纹。我也可能将其缩小,可能在其上打一个水印,并在将其提供给最终用户之前将其保存到磁盘。为了完成所有这些,我发现我必须创建第二个图像对象,以便在将其保存到磁盘之前执行一些必要的任务,因此我将原始图像复制到调整大小的对象中进行处理。见下文:
If Not imageOriginal is nothing then
imageResized = imageOriginal
(如果在数据库中找不到图像,对FindOriginalImage的调用将返回值NOTHING)
....所有其余的调整大小,水印等 - 这段代码都有效......
在我对imageResized对象做了我需要做的所有事情后,我就运行了这一行:
imageResized.Save(DestinationFile, ImageFormat.Jpeg)
大部分时间这都顺利工作,但是当我尝试将文件保存到磁盘时偶尔会出现GDI +泛型错误。
当然,在完成这项工作后,我也处理了这两个对象:
imageResized.Dispose()
imageOriginal.Dispose()
GC.Collect()
有什么想法吗?
答案 0 :(得分:1)
一般来说,“GDI +泛型错误”通常是由文件系统权限问题引起的。检查以确保运行应用程序池的上下文对您尝试保存的文件夹具有相应的“写入”权限。
答案 1 :(得分:0)
首先尝试将图像保存到MemoryStream,然后将内存流转储到文件系统 - 至少可以排除文件/访问问题。