是否建议在显示图像时使用.ashx?

时间:2011-11-11 11:31:13

标签: asp.net image handler image-resizing

建议使用处理程序显示图像吗?问题是我无法右键单击并保存这些图像。它显示处理程序名称和Asp.net通用处理程序作为保存类型,所以我不能保存图像,但GUI图像质量惊人。我正在显示不同大小的单个图像使用2个处理程序,代码工作正常,但如果我不使用处理程序,我必须单独调整大小,然后将它们存储在不同的文件夹中。

2 个答案:

答案 0 :(得分:1)

我不建议使用通用处理程序来显示图像。

我曾经使用这种方法,但除非图像经常变化,否则我认为这是浪费资源。

每次用户转到包含img控件中图像的页面时,浏览器都必须对该文件发出HTTP请求,运行代码并返回流式图像。

例如,如果您只是出于图片缩略图的目的,我会建议您在整个应用程序中上传图片时保存缩略图的物理版本。

这样做的另一个好处是,图像不会像代码那样出错!

答案 1 :(得分:1)

我以前在网站上成功使用过此方法,但只有在特定情况合适的情况下才能使用。如果您可以使用HTML并且您的图像在服务器上的大小正确,那么它可能是矫枉过正的。

如果您发现自己保存了同一图像的多个副本,那么您可以通过动态操作来获益。

在我的场景中,使用.ashx处理程序使我能够为每个主题上传一个大的高分辨率图像,然后将其转换为以几种不同的方式使用:

  • 缩略图
  • 裁剪图片
  • '反射'效果(就像它在闪亮的表面上方)
  • 各种画廊

然后,只是从自定义Image控件调用它并传入正确的参数。

编辑: 关于保存图像,只要我强制.ashx扩展名浏览器试图将其设置为JPEG(或其他),我就可以在我的网站上做得很好。

我不能给你一个完整的.ashx例子,你需要考虑很多子主题:

  • 安全性 - 仅从某些位置读取
  • 格式 - 您打算输出所有图像,例如JPEG,原始格式的图像吗?
  • HttpHandlers - 如何创建和使用它们(不仅仅是图像)
  • 图形操作 - 熟悉.NET中的Graphics对象
  • 内存流

作为一个小例子(在VB.NET中),这是一个在给定新宽度和高度的情况下调整图像大小的简单方法:

Imports System
Imports System.Web
Imports System.Drawing
Imports System.Drawing.Imaging
Imports System.IO
Imports CustomImaging
Imports System.Collections.Generic

Public Class ImgHandler : Implements IHttpHandler


  Public Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest

    'Process the image and output it as a stream from memory

  End Sub

  Public Shared Function ResizeImage(ByVal image As System.Drawing.Image, ByVal width As Integer, ByVal height As Integer) As System.Drawing.Bitmap
        'a holder for the result
        Dim result As New Bitmap(width, height)
        'use a graphics object to draw the resized image into the bitmap
        Dim g As Graphics = Graphics.FromImage(result)
        Try
            'set the resize quality modes to high quality
            g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality
            g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic
            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality
            'draw the image into the target bitmap
            g.DrawImage(image, 0, 0, result.Width, result.Height)
        Catch ex As Exception

        Finally 'clean up resources
            If Not g Is Nothing Then g.Dispose()

        End Try
        'return the resulting image
        Return result
   End Function

   Public ReadOnly Property IsReusable() As Boolean Implements IHttpHandler.IsReusable
        Get
            Return False
        End Get
    End Property

End Class