2

我正在 ASP.NET 中创建一个常规画廊,但我对创建缩略图的经验很少。我知道算法和 GetThumbnailImage 方法,但我的问题出在其他地方 - 我目前正在使用 ImageButton 控件显示图像(刚刚调整大小)。这就是重点——我不知道如何将“缩略图”图像连接到 ImageUrl 属性。甚至有可能吗?如果可以,怎么做?或者我应该改用其他控件吗?感谢您的任何建议!

4

3 回答 3

6

听起来您需要设置一个 HttpHandler,它将创建调整大小的图像并可能还将其缓存到磁盘,以节省在每个请求上重新创建缩略图的麻烦。

因此,例如:

<asp:ImageButton ID="ImageButton1" ImageUrl="~/ImageHandler.ashx?ImageId=123" runat="server />

然后你会有一个处理程序:

namespace MyProject
{
    public class ImageHandler : IHttpHandler
    {
        public virtual void ProcessRequest(HttpContext context)
        {
            // 1. Get querystring parameter
            // 2. Check if resized image is in cache
            // 3. If not, create it and cache to disk
            // 5. Send the image

            // Example Below
            // -------------

            // Get ID from querystring
            string id = context.Request.QueryString.Get("ImageId");

            // Construct path to cached thumbnail file
            string path = context.Server.MapPath("~/ImageCache/" + id + ".jpg");

            // Create the file if it doesn't exist already
            if (!File.Exists(path))
                CreateThumbnailImage(id);

            // Set content-type, content-length, etc headers

            // Send the file
            Response.TransmitFile(path);
        }

        public virtual bool IsReusable
        {
            get { return true; }
        }
    }
}

您还需要在 web.config 中进行设置

<system.web>
    <httpHandlers>
        <add verb="*" path="ImageHandler.ashx" type="MyProject.ImageHandler, MyProject"/>
    </httpHandlers>
</system.web>

这应该足以让你开始。您需要修改 ProcessRequest 方法来创建缩略图,但您提到已经处理了这个问题。您还需要确保在将文件传输到浏览器时正确设置标题。

于 2009-04-16T19:15:15.200 回答
5

您可以创建一个 HttpHandler 来处理图像请求并返回缩略图(或对图像执行任何您需要的操作)。

每当您在 ASP.NET 中进行图形处理时,请记住,几乎所有System.Drawing 都是 GDI+ 的包装器,因此包含对需要正确处理的非托管内存的引用(使用该using语句)。即使对于像 StringFormat 等简单的类也是如此。

于 2009-04-16T19:02:32.157 回答
1

Http 处理程序是要走的路。

关于性能的另一个注意事项:从内存和 CPU 的角度来看,处理图像相对于磁盘空间来说是昂贵的。因此,从完整图像生成缩略图是您只想为每个完整图像执行一次的操作。执行此操作的最佳时间可能是在上传图像时,特别是如果您将在同一页面上显示其中的多个。

于 2009-04-16T19:41:42.593 回答