在VB中使用ASP.NET处理图像时提高性能

时间:2012-06-16 20:13:21

标签: vb.net performance image-processing graphics system.drawing

我正在努力加快我网站的各个方面。

该网站是一个购物网站,各种搜索页面都很慢。这有几个潜在的原因,一个是使用图像。

另一个晚上,我创建了一个为我的Facebook OG标签生成缩略图的功能。该函数将方形图像写入服务器400px x 400px,通过平铺搜索查询生成的前几个(最多14个)产品图像创建。

test.aspx文件上完全隔离运行此脚本可以为我提供合理的加载时间,但是我无法做任何事情可以加快速度,即使我没有在浏览器中返回任何内容,只需执行此过程即可大约需要3秒钟,这显然会扩大整个现场的速度。

整个代码是:

Function mergeImgs(idList, imgList, head, fileName) As String

    Try
        Dim maxRows = HttpContext.Current.Request.QueryString("r")
        Dim imgDim = 400
        Dim Image3 As New Bitmap(imgDim, imgDim)
        Dim g As Graphics = Graphics.FromImage(Image3)

        Dim i = 0
        Dim left = 0
        Dim rows = 0
        For Each item In idList
            Dim img = Common.getImageUrl(idList(i), imgList(i), "server", "-tb")
            i += 1
            If img <> "/Images/awaiting.png" Then

                Dim imageData As System.Drawing.Image = System.Drawing.Image.FromFile(img)
                Dim aspect As Double = imageData.Width / imageData.Height ' determine aspect and decide how to display image

                Dim Image1
                Dim fixedHeight = imgDim / maxRows
                Dim objGraphic As System.Drawing.Image = System.Drawing.Image.FromFile(img)

                Dim aspectRatio = objGraphic.Height / objGraphic.Width
                Dim reduction = fixedHeight / objGraphic.Height
                Dim newwidth = objGraphic.Width * reduction
                Image1 = New Bitmap(objGraphic, objGraphic.Width * reduction, fixedHeight)

                g.DrawImage(Image1, New Point(left, fixedHeight * rows))
                If left >= imgDim Then
                    rows += 1
                    left = 0
                ElseIf left < imgDim Then
                    left += newwidth
                ElseIf left < imgDim AndAlso rows = maxRows Then
                    Exit For
                End If
            End If
        Next

        Image3.Save(HttpContext.Current.Server.MapPath("/" & fileName), System.Drawing.Imaging.ImageFormat.Jpeg)

        Return rootUrl & fileName

        g.Dispose()
        g = Nothing

    Catch ex As Exception
        Return ("<P>" & ex.ToString)
    End Try
End Function

有一个外部函数getImageUrl,它只是一系列逻辑,它根据项目ID写出一个目录结构,这很快,所以我怀疑它完全没有。

传递给函数的变量是:

idList = a generic List(of String) ' a list of item IDs
imgList = a generic List(of String) ' a list of image names (image names only stored in DB)
head = the Page.Header ' not actually needed in this prototype, but aimed to allow this to write the OG tag to the Page Header
fileName = simply the name to give the generated image file

我不禁想到

部分
Dim imageData As System.Drawing.Image = System.Drawing.Image.FromFile(img)

以后可能会加速。这样做是计算出加载的图像的纵横比,然后重新计算尺寸,使它们的高度都相同,这样就可以整齐地填充图块。

Dim img = Common.getImageUrl(idList(i), imgList(i), "server", "-tb")

此行加载相关图像的缩略图版本(最后一个变量中的“-tb”),因此所处理的所有图像大约为50x50像素,因此非常小,无法加载并确定宽高比

我的服务器上存储了4个版本的每个图像,有4种不同的尺寸可供网站快速显示,这里加载了不同的图像,这似乎对脚本的加载时间没什么影响。

有什么比System.Drawing.Image.FromFile(img)更快的速度可以用来加载图像并确定它的宽度和高度吗?

在我的网站上还有其他一些情况,我需要确定图像的尺寸然后用它做一些事情,而且看起来有点慢。

欢迎任何建议!

仅供参考,以下是上述代码

生成的图像示例

http://www.hgtrs.com/recents.jpg

这是从此页面返回的产品生成的(可能会加载缓慢!):

http://www.hgtrs.com/search.aspx?Type=recents

我应该声明我的test.aspx文件还包括对数据库的调用,测试了直接使用的查询,我得到的查询时间为0.18秒,我不知道这次是如何扩展到实际应用程序的。我已经根据我的了解优化了这个查询和表(它使用了一个嵌套查询和连接)。

0 个答案:

没有答案