【发布时间】:2014-07-27 22:43:13
【问题描述】:
我在 ASP.NET 4.0 中构建了一个动态图像大小调整 Web 应用程序,它在使用 IIS 7.5 的 Windows 2008 R2 服务器上运行。
图像本身作为二进制最大字段存储在 SQL 2008 R2 数据库中(图像足够小,这是可行的,我们最初尝试了 filestream 选项,但对于我们的目的来说太慢了)
我查询数据库以检索“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()
有什么想法吗?
【问题讨论】:
-
如果您要覆盖源文件,您必须确保首先处理打开/锁定文件的对象。
Using块会有所帮助 -
hmmm 很有趣 - 实际上有可能有多少请求进来,不止一个人可以触发“调整”图像大小的代码(这是一个自定义的 404 处理页面)。一旦以请求的大小创建图像,所有未来的用户都将直接使用它 - 因此除非删除调整大小的版本,否则代码不应再次运行。我将对此进行调查 - 鉴于这种情况很少发生,这可能是原因。