第八章:杂项功能

CMYK到RGB的转换

大多数数码图像是用RGB处理的。那是说,在这种图像中的每个像素中的颜色是用三种成分表达的——红、绿、蓝(RGB),它们对应于显示器上的三种阴极发射体。而另一方面,在用于印刷的图像上,像素是用四种色素表达的——靛青、品红、黄色和黑色(CMYK),它们对应到打印机中使用的四种原始的油墨颜色。

用CMYK颜色空间创建的JPEG和TIFF图像不能在Web上浏览,Internet Explorer会用一个红叉图标显示它们。要想使CMYK图像可浏览,AspJpeg 1.5以来的版本提供了一个新方法,ToRGB,它会把CMYK像转换成RGB颜色空间。

把CMYK转换成RGB决不是一个微不足道的任务,完成它没有捷径。要想实现合理良好的色彩再现,ToRGB方法实施了一系列基于配置方案的复杂的非线性颜色转换,配置方案是由国际色彩协会(CII)确立的标准颜色空间。欲了解更多关于ICC配置方案的信息,请访问www.color.org

CMYK到RGB的转换是一个十分消耗CPU的程序步骤。因此很重要的一点是先缩小图像然后调用ToRGB方法。

VB Script:

' Fast
Jpeg.Width = Jpeg.OriginalWidth / 2
Jpeg.Height = Jpeg.OriginalHeight / 2
Jpeg.ToRGB
' Slow
Jpeg.ToRGB
Jpeg.Width = Jpeg.OriginalWidth / 2
Jpeg.Height = Jpeg.OriginalHeight / 2

Jpeg.ToRGB只有在当前图像是CMYK或灰度颜色空间时有效果。如果图像已经是一个RGB图像,该方法什么也不会做。

要想看到实践中的CMYK到RGB的功能,请运行演示文档3

图像分辨率

图像分辨率是嵌入在图像中的信息,指定了这个需要打印的图像的印刷品质。分辨率通常使用点每英寸(DPI)来表达。72DPI或96DPI的图像会被视为低分辨率,300DPI和更高者会被视为高分辨率。

大多数图像查看器,比如说你的Web浏览器,会忽略分辨率信息,简单地为屏幕呈现使用图像的像素尺寸。高级的图像管理器以及打印系统比如说Photoshop在打印的时候会使用图像分辨率以计算图像在纸上的正确尺寸。注意分辨率信息并不总是嵌入在一个图像中的。如果没有嵌入的话,它会被假定为72DPI。

AspJpeg 1.5以上的版本让你能够读取图像的分辨率信息,还能够设置一个新分辨率。属性OriginalResolutionX和属性OriginalResolutionY分别以水平和垂直坐标返回当前的DPI分辨。如果这些属性每个都返回1,表示在此图像中没有嵌入分辨率信息。然而很有可能这些信息依然存在,但是是以EXIF标签的形式存在(关于EXIF的更多信息请阅读前一章。)

以下代码片段试图从一个任意的图像中读取X和Y分辨率:

<%
path = "c:\path\image.jpg"
jpeg.Open(path)
XRes = jpeg.OriginalResolutionX
YRes = jpeg.OriginalResolutionY

If XRes = 1 and YRes = 1 Then
  ' Look among EXIF tags
  Set Info = jpeg.OpenInfo(path)

  If Info("XResolution") <> "" Then
    XRes = Info("XResolution")
    YRes = Info("YResolution")
  Else
    Response.Write "Resolution info not found."
  End if
End If
%>

要想设置新分辨率,使用属性ResolutionX和属性ResolutionY,如下所示:

...
Jpeg.ResolutionX = 72
Jpeg.ResolutionY = 72
...
Jpeg.Save path

访问个别像素

从v1.5版开始,AspJpeg可以通过主AspJpeg对象的默认属性Pixels来设置并读取一个图像的个别像素。这个属性接受两个参数(x,y),它们指定了要设置或读取的像素的位置。这个属性返回该像素的一个颜色成分数列,或者用该像素的一个颜色成分数列对它赋值。在一个RGB图像中,这个数列一定精确包含三个元素。一个图像的颜色成分的数字可以通过属性Jpeg.OriginalComponent来读取。

因为Pixels是默认的属性,所以它可以被省略掉了。以下代码片段演示了这种技术:

VB Script:

' Set pixel (20, 50) to green
jpeg.Pixels(20, 50) = array(0, 255, 0)
' Retrieve pixel (30, 40). The word "Pixels" is optional
arr = jpeg(30, 40)
for i = 0 to jpeg.OriginalComponents - 1
  Response.Write arr(i) & " "
Next

C#:

'Set pixel (20, 30) to orange
Object [] arr = new Object[3];
arr[0] = (Object)255;
arr[1] = (Object)128;
arr[2] = (Object)0;
objJpeg[20, 30] = arr;

' Retrieve pixel (15, 20)
Array arr2 = (Array)objJpeg[15, 20];
for( int i = 0; i < objJpeg.OriginalComponents; i++ )
  Response.Write( arr2.GetValue(i).ToString() + " " );

渐进式Jpeg文件

一个渐进式的JPEG是一个隔行扫描的GIF的等价物。这样的图像哪怕只下载了一部分也可以以全尺寸显示,但是是以低品质显示。随着有越来越多的数据到达,图像逐渐变得越来越清晰锐利,直到整个图像都下载完了。这个功能使渐进式的图像在较慢接的环境中更吸引人。

在AspJpeg 1.5之后的版本中,你可以通过设置属性ProgressiveTrue来创建渐进式的JPEG:

Jpeg.Progressive = True
...
Jpeg.Save path

值得注意的是,Netscape是目前支持渐进式JPEG逐步绘制的唯一一种主流浏览器,其他浏览器会整个图像在完全下载之后才显示图像。

亮度、对比度和饱和度

从v1.7版开始,AspJpeg可以通过多功能的Adjust方法调整一个图像的亮度、对比度和饱和度。这个方法用两个参数表达:操作代码以及操作指定值。

要想调整亮度,必须向第一个参数传递值1,在范围[-1,1]之间的亮度值传递为第二个参数。大于0的值会增加亮度,小于0的值会降低亮度:

jpeg.Adjust 1, 0.05

要想调整对比度,必须向第一个参数传递值2,在范围[0.001,5]之间的对比度值传递为第二个参数。大于1的值会增加对比度,小于1的值降低了对比度。

jpeg.Adjust 2, 1.2

要想调整饱和度,必须向第一个参数传递值3,在范围[-1,1]之间的饱和度值传递为第二个参数。大于0的值会增加饱和度,小于0的值降低了饱和度。

jpeg.Adjust 3, -0.2

该Adjust方法只能应用到RGB图像上。

在v2.6版以后,Adjust方法被废弃了。添加了一个更通用万能的方法,ApplyFilter方法,会在后面章节中讲解它,可以用来代替Adjust方法。

滤镜

从v2.6版以来,AspJpeg个方法,ApplyFilter方法,提供了一些常用的图像滤镜,比如说亮度、对比度、饱和度、模糊度、锐利图、查找边缘以及其它滤镜。这个方法接受三个参数:滤镜ID、两个滤镜专有的参数。第一个参数是一个数字,第二个是一个可选的变量值。有些滤镜只需要第一个或第二个参数,或者两个参数都要,还有一些一个参数都不要。

以下表格总结了所有当前支持的滤镜,右边的图片是应用滤镜的结果。

名称滤镜ID参数1参数2示例输出以及注意
亮度1亮度数,范围[-255,255]之间的一个数字。没使用
Jpeg.ApplyFilter 1, 100
对比度2对比度数,范围[-255, 255]之间的一个数字。没使用
Jpeg.ApplyFilter 2, 100
饱和度3饱和度数,范围[-100, 100]之间的一个数字。没使用
Jpeg.ApplyFilter 3, -50
高斯模糊4模糊半径,一个正数,点尺寸,是3到21
之间的奇数(默认是7)。

Jpeg.ApplyFilter 4, 3, 5
锐化50是不锐化,1是较锐利。没使用
Jpeg.ApplyFilter 5, 0
一般卷积6没使用点矩阵,一个数字的数列指定相关的邻接
像素的权重,这些权重数列会应用到图像
的每个像素的。数列的长度必须是一个平
方数,在范围集合[9,25,49,...,441]之内。

Jpeg.ApplyFilter 6, 0, Array(
-2, -1, 0, -1, 1, 1, 0, 1, 2)
锐化、模糊、浮雕以及很多其它滤镜
都基于一个一般卷积变换。该示例中
的点是一个浮雕滤镜。
阈值7范围[0,255]之内的阈值。没使用
Jpeg.ApplyFilter 7, 150把图像转换为单色画(只有黑和白)。
查找边缘8没使用没使用Jpeg.ApplyFilter 8, 0实现了索贝尔查找边缘算法。把图像
变成灰度。

注意,ApplyFilter方法不能用在CMYK图像上。

色度键

色度键指的是一个视觉效果,其中两个图像以某种方式混合到一个图像中,第一个图像的单色(通常是绿色或蓝色)背景被替换成第二个图像,与此同时前景主题依然保持不变。它常用于天气预报广播,以及其它领域。

从v2.6版以来,AspJpeg通过它的Canvas对象的DrawImageChromaKey方法,实现了以度键效果。这个方法类似于DrawImage方法,把一个图像画在另一个图像的上面,但是它在做这个的同时,还会移除被绘制的图像的单色背景。

DrawImageChromaKey方法需要8个参数。前三个参数与DrawImage方法的参数相同:X坐标和Y坐标,以及一个AspJpeg对象的实例,实例代表要绘制到当前图像上面的图像。另外五个参数控制了要绘制的图像的单色背景的操作:键颜色的RGB值(背景的主导颜色),以及两个颜色距离值Dist1和Dist2。所带的颜色与键颜色的差距近过Dist1的所有像素都会做成透明。所带的颜色与键颜色的差距远过Dist2的像素都会做成不透明。所带的颜色在两者之间的像素被做成半透明,以获得较好的混合。所有的这些参数都是根据审查来选择,并根据针对每个背景的错误来选择。

上面的图像用以下代码示例创建:

VB Script:

<%
Set BG = Server.CreateObject("Persits.Jpeg")
' Open background image
BG.Open Server.MapPath(".") & "/../images/gym.jpg"

' Open image with subject against monochromatic background
Set Jpeg = Server.CreateObject("Persits.Jpeg")
Jpeg.Open Server.MapPath(".") & "/../images/greenscreen.jpg"

' Draw it on the background. Remove "green screen".
' Key color's RGB values: (60, 205, 72)
' Color distances: 20, 80
BG.Canvas.DrawImageChromaKey 0, 0, Jpeg, 60, 205, 72, 20, 80

BG.Save Server.MapPath("chroma.jpg")
%>

C#:

// Compute paths to source images
String strBGPath = Server.MapPath("../images/gym.jpg");
String strPath = Server.MapPath("../images/greenscreen.jpg");
IASPJpeg objBG = new ASPJpeg();

// Open background image
objBG.Open( strBGPath );

// Open image with subject against monochromatic background
IASPJpeg objJpeg = new ASPJpeg();
objJpeg.Open( strPath );

// Draw it on the background. Remove "green screen".
// Key color's RGB values: (60, 205, 72)
// Color distances: 20, 80
objBG.Canvas.DrawImageChromaKey( 0, 0, (ASPJpeg)objJpeg, 60, 205, 72, 20, 80 );

objBG.Save( Server.MapPath("chroma.jpg") );

FramedImage.Src = "chroma.jpg";

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

http://localhost/aspjpeg/manual_08/08_chroma.asp

http://localhost/aspjpeg/manual_08/08_chroma.aspx

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

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