65.9K
CodeProject 正在变化。 阅读更多。
Home

一个简单的图像处理程序

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.25/5 (8投票s)

2008年5月5日

CPOL

3分钟阅读

viewsIcon

72389

downloadIcon

2480

一个 ASP.NET 处理器,用于动态调整图像大小和旋转/翻转图像。

Sample Image

引言

本文解释了如何使用 ASP.NET 处理器来提供图像。 为什么要使用图像处理器? 最重要的原因是防止图像链接失效。 我专注于创建一个图像处理器,除了基本功能之外,还可以根据 URL 查询字符串参数来调整图像大小和旋转/翻转图像。 最后,使用 .NET 数据缓存来提高提供图像的性能。

Using the Code

处理器做的第一件事是检查图像(存储为位图)是否存在于 .NET 数据缓存引擎中。 此处理器实现了两个级别的缓存。 第一个缓存基于查询字符串。 因此,例如,URL 请求“ImageHandler.ashx?image=images/rover.gif&width=200&height=400”将具有基于 URL 参数“?image=images/rover.gif&width=200&height=400”的缓存。 如果找到此缓存,则会从缓存中将图像呈现为 JPEG,从而节省响应时间和处理能力。 如果此缓存不存在,则将检索并处理该图像。 这是第二个缓存层存在的地方。 由于可以根据 URL 参数以多种方式请求原始位图,因此在检索原始图像后也会对其进行缓存,从而减少了对硬盘驱动器的请求。

if (context.Cache[("ImageQueryURL-" + context.Request.QueryString.ToString())] != null)
{
    bitOutput = (Bitmap)context.Cache[("ImageQueryURL-" + 
                         context.Request.QueryString.ToString())];
}

在此步骤中,我们确定要调整图像大小的尺寸。 可以将高度和/或宽度作为查询字符串参数传递,以确定输出大小。 在此代码块中,当同时传递高度和宽度时,将调整图像大小。

double inputRatio = Convert.ToDouble(bitInput.Width) / 
                    Convert.ToDouble(bitInput.Height);
    
if (!(String.IsNullOrEmpty(context.Request["width"])) && 
    !(String.IsNullOrEmpty(context.Request["height"])))
{
    _width = Int32.Parse(context.Request["width"]);
    _height = Int32.Parse(context.Request["height"]);
    return true;
}

获得图像后,再次检查查询字符串,这次是用于旋转和翻转。

if (String.IsNullOrEmpty(context.Request["RotateFlip"]))
{
    return bitInput;
}
else if (context.Request["RotateFlip"] == "Rotate180flipnone")
{
    bitOut.RotateFlip(RotateFlipType.Rotate180FlipNone);
}

最后,我们使用 Windows GDI+ 引擎调整图像大小。 我们使用高质量的渲染模式来减少伪影,但这需要付出处理和响应时间的代价。 这是数据缓存成为此类重要组成部分的另一个原因。

Bitmap resizedBitmap = new Bitmap(newWidth, newHeight, PixelFormat.Format24bppRgb);

Graphics g = Graphics.FromImage(resizedBitmap);
g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
g.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceCopy;
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
Rectangle rectangle = new Rectangle(0, 0, newWidth, newHeight);
g.DrawImage(inputBitmap, rectangle, 0, 0, inputBitmap.Width, 
            inputBitmap.Height, GraphicsUnit.Pixel);
g.Dispose();

改进/构建此代码的方法

此项目的目标是创建一个简单易用的图像处理器,所有代码都包含在一个类中。 我确保将所有代码都放在单个处理器类中,以便可以轻松地将其放入项目中,而无需大量的配置麻烦。 但是,必须做出一些妥协。 通常,处理器旨在处理 IIS 中定义的某些文件类型。 我没有让代码以这种方式工作,因为它不容易与 CodeProject 社区共享,但可以通过一些小的修改来做到这一点。 我还将 noImageUrl 定义为配置变量,可能在 web.config 文件或其他配置文件中。

最后,使用图像处理器的最大优势在于,您可以将图像的实际物理位置与它们在浏览器中显示的位置分离。 您可能会发现自己处于需要移动图像物理位置的情况,这对系统中可能具有硬编码图像路径的许多不同组件产生连锁影响。

最新下载

© . All rights reserved.