第四章:多种图像操作方式

缩放算法

在v2.2版以前,AspJpeg支持三种流行的图像缩放算法:最邻近、二次线性、二次立方。在v2.2版中,新增了13种图像缩放算法。缩放算法多种多样,很大程度上决定了输出缩略图的品质、清晰度和性能。

可以通过属性Interpolation来指定生成缩略图的算法。默认的算法是二次线性(1)。下表总结了所有可用的算法、它们的示例输出以及性能,与默认算法作对比。注意缩略图的品质通常是占用不菲的性能资源换来的。

原始图像:

Jpeg.Interpolation算法效果相对于1的执行时间(大约数)
0Nearest neighbor(All versions)0.56
1Bilinear(All versions)1.00
2Bicubic(All versions)2.63
3Bell(Version 2.2+)1.15
4Box(Version 2.2+)1.00
5Catmull Rom(Version 2.2+)1.15
6Cosine(Version 2.2+)1.18
7Cubic Convolution(Version 2.2+)1.67
8Cubic Spline(Version 2.2+)1.30
9Hermite(Version 2.2+)0.96
10Lanczos3(Version 2.2+)1.67
11Lanczos8(Version 2.2+)3.41
12Mitchell(Version 2.2+)1.36
13Quadratic(Version 2.2+)0.98
14Quadratic B-Spline(Version 2.2+)1.15
15Triangle(Version 2.2+)0.98

图像锐化

从v1.1版开始,利用Sharpen方法,AspJpeg可以对要缩放的图像应用一个锐化滤镜。一个普通的缩略图以及两个分别应用了不同的程度的锐化的缩略图如下所示:

没有锐化Sharpen(1, 120)Sharpen(1, 250)

Sharpen方法使用两个双精度型参数:RadiusAmountRadius控制一个围绕着每个像素的区域的尺寸(以像素计),锐化算法对该区域进行检查。该参数一般设置为1或2。Amount(用%表达)指定了锐化的程度。该参数必须大于100。

为了使该属性生效,必须在调用Save方法、SendBinary方法或属性Binary之前设置该属性。

图像裁剪

AspJpeg 1.1以后的版本还可以利用Crop(x0,y0,x1,y1)方法,从结果的缩略图中修剪掉边缘,或者说是作裁剪操作。裁剪的图像的尺寸可以用结果缩略图内部的左上角和右下角的坐标来指定,而不是原始大图片内部的左上角和右下角的坐标。

如果向Crop方法传递的坐标,其中的一个或不止一个坐标在图像坐标空间的外面,这很有用,举个例子,如果你需要围绕着图像创建边距。以下代码围绕着图像创建了一个10像素的边距:

jpeg.Crop -10, -10, jpeg.Width + 10, jpeg.Height + 10

重要醒提:在v1.7版以前,用负数裁切创建的边距总会是白色的。从v1.7以后,它由Canvas.Brush.Color指定的颜色决定,而且默认是黑色的。要想在v1.7以后的版本中创建白色的10像素边距,必须使用以下代码:

jpeg.Canvas.Brush.Color = &HFFFFFF
jpeg.Crop -10, -10, jpeg.Width + 10, jpeg.Height + 10

图像翻转和旋转

在AspJpeg 1.2以后的版本中,你可以通过调用FlipH方法和FlipV方法分别让一个图像作水平翻转、垂直翻转。

你还可以通过调用RotateR方法和RotateL方法,分别让一个图像顺时针旋转90度、逆时针旋转90度。

在v2.3版本以后,AspJpeg还可以利用Rotate方法,用任意角度旋转一个图像。该方法需要两个参数:顺时针旋转的角度(以degree计),以及由旋转造成的四个三角形角落区域的填充色。图像的宽度和高度会自动增加,以适应斜过来的图像。

以下代码把一个图像旋转了24degree,并用红色填充四个角落。

jpeg.Rotate 24, &HFF0000

结果如下所示:

利用PNG图像格式,AspJpeg还能够完整地移除四角区域,使它们完全透明。用这种方法,旋转过的图像可以绘制在别的图像的顶部。这个功能在本手册的第十章第4:为图像旋转使用PNG格式中讲解。

调整图像压缩率

JPEG格式使用“有损的”压缩方法。这意味着图像保存为JPEG时,在压缩过程中,图像的一些微小的细节都损失掉了。损失率可以用属性Jpeg.Quality来调整。该属性接受一个界于0到100之间的整型数,0表示最高的损失率(因此,图像品质最差),100表示最低的损失率以及最高的品质。

损失越低,生成的文件大小越大。属性JPEG.quailty默认设置为80,它提供了接近最优的品质和文件字节大小的组合。

灰度转换

从v1.4版开始,AspJpeg可以利用Grayscale方法,把彩色图像转换成灰度图像。该方法需要一个Method参数,该参数指定了一个实施彩色到黑白转换的计算公式。有效的值是0、1和2。对于大多数应用程序,值1是推荐方法。

Grayscale方法,使用以下计算公式把每个像素的三种颜色成分(R、G、B)设置为同一个值L:

方法公式
0L = 0.3333 R + 0.3333 G + 0.3333 B
1L = 0.2990 R + 0.5870 G + 0.1140 B
2L = 0.2125 R + 0.7154 G + 0.0721 B

以下图表演示了Method参数的效果:

方法效果
原始图像
0
1
2

方法0的效果在Photoshop中称为“去色”(图像=>调整=>去色),而方法1类似于Photoshop中的把RGG转换成灰度(图像=>模式=>灰度)。

注意Grayscale是一个方法,不是一个属性,因此不需要使用“=”号。

Jpeg.Grayscale 1

Grayscale方法把彩色图像转换成黑白双色,但是留下了图像的原始RGB颜色空间(每像素3字节)。在v2.1版本之后,AspJpeg还可以利用Jpeg.ToGrayscale方法,把RGB或CMYK图像转换成灰度颜色空间(每像素1字节),该方法同样接受一个参数Grayscale。该ToGrayScale方法使图像文件更加,而且对PNG的alpha通道管理也很有用。第十章讲解了PNG的alpha通道管理。

Sepia滤镜

AspJpeg 1.6以后的版本提供了Sepia方法,能使一个图像看起来像是旧照片。这个方法的两个参数,Hue(色相)和Contrast(对比度),使你能够把输出调整到符合你的品味。

Hue参数控制了输出图像中的褐色色相,而且一般在荒置25到60之间,可取得好结果。Contrast参数控制了图像的对比度。值1表示没有对比度调整。在1.2到1.5之间的值通常能带来好结果。

原始图像Hue=50, Contrast=1.4

这里显示的示例Sepia转换可以用以下代码实现:

Jpeg.Sepia 50, 1.4

代码示例

以下代码示例通过交互式地对一个图像应用多种变换,演示了大多数上面提到的功能。文件04_process.asp/aspx包含了一个带勾选框的表单,以及一个单选钮,控制了图像的视觉外观。该文件引用了脚本04_process.asp/aspx,它们包含了实际的图像修改常规方法,如下所示。

VB Script:

<%
Set Jpeg = Server.CreateObject("Persits.Jpeg")
Jpeg.Open Server.MapPath("clock.jpg")
Jpeg.Width = Jpeg.OriginalWidth * .8
Jpeg.Height = Jpeg.OriginalHeight * .8

If Request("Grayscale") = "1" Then
   Jpeg.Grayscale 1
End If

If Request("Sharpen") = "1" Then
   Jpeg.Sharpen 1, 250
End If

If Request("Horflip") = "1" Then
   Jpeg.FlipH
End If

If Request("Verflip") = "1" Then
   Jpeg.FlipV
End If

Jpeg.Quality = Request("Quality")
Jpeg.Interpolation = Request("Interpolation")

If Request("Crop") = 1 Then
   Jpeg.Crop 30, 30, 470, 320
End If

Jpeg.SendBinary
%>

C#:

<%@ Import Namespace="System.Web" %>
<%@ Import Namespace="System.Reflection" %>
<%@ Import Namespace="ASPJPEGLib" %>
<%@ Page aspCompat="True" Language="C#" Debug="true" %>
<script runat="server" LANGUAGE="C#">

void Page_Load(Object Source, EventArgs E)
{
ASPJPEGLib.IASPJpeg objJpeg;
objJpeg = new ASPJPEGLib.ASPJpeg();

objJpeg.Open( Server.MapPath("clock.jpg") );

objJpeg.Width = (int)(objJpeg.OriginalWidth * 0.8);
objJpeg.Height = (int)(objJpeg.OriginalHeight * 0.8);

if( Request["Grayscale"] == "1" )
objJpeg.Grayscale( 1 );

if( Request["Sharpen"] == "1" )
objJpeg.Sharpen( 1, 250 );

if( Request["Horflip"] == "1" )
objJpeg.FlipH();

if( Request["Verflip"] == "1" )
objJpeg.FlipV();

objJpeg.Quality = int.Parse(Request["Quality"]);

objJpeg.Interpolation = int.Parse(Request["Interpolation"]);

if( Request["Crop"] == "1" )
objJpeg.Crop( 30, 30, 470, 320 );

objJpeg.SendBinary(Missing.Value);
}

</script>

点击以下链接以运行该代码示例:

http://localhost/aspjpeg/manual_04/04_params.asp

http://localhost/aspjpeg/manual_04/04_params.aspx

如果你喜欢这篇文章,敬请给站长打赏↑

除特别注明外,本站所有文章均为本站站长原译,转载请注明出处。