Programmer's Guide to the JavaTM 2D API -- Chapter 6 Color

Contents | Previous | Next Programmer's Guide to the JavaTM 2D API

原文:
1) http://java.sun.com/j2se/1.5.0/docs/guide/2d/spec/j2d-color.html
2) j2sdk5.0-docs/guide/2D/spec/j2d-image.html
翻译: Unagain

Chapter    6

Color

图像上色是图形系统基本组成部分之一,经常也是成像模型中的极大复杂性的源头。Java 2D™ API提供了对高质量颜色输出的支持,容易使用并且也允许高级开发人员创作关于颜色的富有技巧的应用。

Java 2D API中颜色管理的核心类ColorSpace, Color, ColorModel:

    • ColorSpace表现了一个度量颜色的系统,代表性地使用3个分离的数值或成分。ColorSpace类含有自身的颜色空间与两个基本颜色空间(CIEXYZ 和RGB)进行转换的方法
    • Color是固定的颜色,由它的在特定ColorSpace中的成分定义。要使用画一个某种颜色的Shape,比如红色,你就要传递一个表示该颜色的Color对象到Graphics2D的设置场景中。Colorjava.awt package中定义。
    • ColorModel描述了一种特定的方法,可以是像素值与颜色对应。ColorModel典型地关联于一个ImageBufferedImage,并且提供正确解释像素所需要的信息。ColorModeljava.awt.image packag中定义。

6.1 类

Class
Description
描述
ColorSpace
标识一个 Color对象、 ImageBufferedImage或者 GraphicsDevice的颜色空间。拥有在RGB和CIEXYZ颜色空间中进行转换的方法。
ICC_ColorSpace
Extends: ColorSpace
表现基于ICC特征表格式规格说明(ICC Profile Format Specification)的设备无关和设备相关的颜色空间.
ICC_Profile
针对基于ICC特征表格式规格说明(ICC Profile Format Specification)的设备无关和设备相关的颜色空间的颜色特征表(profile)数据的表现方式。
ICC_ProfileGray
Extends: ICC_Profile
灰度类型颜色空间的表现。
ICC_ProfileRGB
Extends: ICC_Profile
RGB类型颜色空间的表现。

6.2 颜色的概念

ColorModel用于解释图像中的像素。包括把图像波段中的分量映射为指定颜色空间的分量。也包括从打包的像素中提取分量,使用屏蔽从单一波段中获得若干个分量,以及通过查找表转换像素数据。

要确定图像中指定像素的颜色值,你需要知道颜色信息是怎样编码到每个像素中的。与图像相关联的ColorModel封装了所需的数据和方法,以实现像素数据与其颜色成分之间的相互转换。

除了在JDK 1.1版本定义的DirectColorModelIndexColorModel,Java 2D™ API还另外提供了两个颜色模型:

    • ComponentColorModel可以处理任意的ColorSpace和匹配于该ColorSpace的颜色分量数组。这个模型可以用来表现能在大多数类型的GraphicsDevices上使用的大多数颜色模型。
    • 有些模型表现这样的像素,像素值为整型、其颜色分量作为数据位直接嵌入到像素的值中,PackedColorModel正是这类模型的基本类。PackedColorModel存储了描述怎样从信道中提取颜色和alpha分量的打包过程信息。JDK 1.1中的DirectColorModel就是一种PackedColorModel.
6.2.0.1 ColorSpace

ColorSpace对象提供一个度量颜色的系统,代表性地使用3种分离的数值。例如,RGB和CMYK都是颜色空间。ColorSpace对象用作为颜色空间的标签,标识特定Color对象的颜色空间,或者是ImageBufferedImageGraphicsConfiguration等经由ColorModel对象指定颜色空间。ColorSpace提供在指定的颜色空间中,sRGB或者定义明确的CIEXYZ颜色空间,转换Colors的方法。

所有ColorSpace对象必须能够从指定的颜色空间中映射颜色到sRGB,并且也能转换sRGB颜色到指定颜色空间。因为每个Color都包含一个ColorSpace对象,或明确定义或默认,所以每个Color也都可以转换为sRGB。所有GraphicsConfiguration被一个ColorSpace对象关联,反过来说就是拥有一个与之关联的ColorSpace。一个由任何颜色空间指定的颜色,通过以sRGB为中介颜色空间的映射,可以显示到任何设备上。

这个处理过程使用的方法是toRGBfromRGB:

    • toRGB把一个给定颜色空间的Color转换为sRGB中的Color
    • fromRGB取得一个sRGB中的Color,并转换到给定的颜色空间。

虽然经由sRGB映射总是可行,但它并不总是最好的解决方法。首先,sRGB不能表现CIEXYZ颜色全部色域。如果有一种颜色由一个其色域(可被描绘的颜色的光谱)不同于sRGB的颜色空间指定;那么,使用sRGB作为转换的中介空间就会导致信息的损失。要解决这个问题,ColorSpace类可以把另外一个颜色空间,“conversion space” CIEXYZ,作为颜色映射的源或目标。

toCIEXYZfromCIEXYZ方法映射颜色值 从给定的颜色空间到转换空间。这些方法支持在任意两个颜色空间之间、以相当高的精确度的进行转换,每次一个Color。不管怎样,预期Java 2D API的实现将会支持基于底层平台的颜色管理系统的、操作整个图像的高性能转换。(参考ColorConvertOp in “Imaging” on page 67.)

Figure 6-1Figure 6-2举例说明了转换CMYK颜色空间指定的颜色以使其能在RGB颜色的显示器中显示的处理过程。Figure 6-1显示了一个经由sRGB的映射。如图所示,由于彼此的色域不匹配,从CMYK颜色到RGB颜色的转换是不精确的。1

 

The previous context describes this graphic.

 

Figure 6-1 Mapping Through sRGB

Figure 6-2显示了使用CIEXYZ作为转换空间的同样过程。当使用了CIEXYZ时,颜色一直被精确地传递。

 

The previous context describes this graphic.

 

Figure 6-2 Mapping Through CIEXYZ

6.2.0.2 ICC_Profile和ICC_ColorSpace

实际上ColorSpace是一个抽象类。Java 2D API为其提供了一个实现类,ICC_ColorSpace,该类基于由ICC_Profile表示的ICC特征表(ICC Profile)数据。你可以定义你自己的子类来表现任意的颜色空间,只要实现上面讨论的方法。然而,大多数开发人员可以简单地使用默认的sRGB ColorSpace或者由通用ICC特征表(ICC Profiles)表现的颜色空间,比如显示器和打印机的特征表(profiles),或者嵌入到图像数据里的特征表(profiles)。

“ColorSpace” on page 90记述了ColorSpace对象怎样表现一个颜色空间以及给定空间中的颜色怎样以转换空间为源或者目标实现映射。颜色管理系统经常用来处理颜色空间之间的映射。一个典型的颜色管理系统(CMS)管理着ICC特征表(ICC profiles),一个类似于ColorSpace对象的对象;ICC特征表(ICC profiles)描述了输入空间和连接空间,并定义了二者之间的映射关系。颜色管理系统非常善于计算出怎样把一个特征表(profiles)标记的颜色映射到另一个特征表(profiles)的空间。

Java 2D API定义了一个类叫做ICC_Profile,用来处理任意ICC特征表(ICC profiles)的数据。ICC_ColorSpaceColorSpace抽象类的实现。ICC_ColorSpace对象可以从ICC_Profiles创建(当然也有一些局限—不是所有的ICC Profiles都适合定义ICC_ColorSpace)。

ICC_Profile由几个子类对应于特定的颜色空间类型,比如ICC_ProfileRGBICC_ProfileGray。每个ICC_Profile的子类拥有定义明确的输入空间(例如RGB空间)和定义明确的连接空间(象CIEXYZ)。Java 2D API可以为不同类型的设备象扫描仪、打印机和监视器,使用操作平台的CMS存取颜色特征表(profiles)。它也能使用CMS找到特征表(profiles)之间最好的映射。

6.2.1 细说颜色

Color类提供了对特定颜色空间的某个颜色的描述。Color的实例包含了颜色分量的值以及一个ColorSpace的对象。由于ColorSpace对象可以在新的Color实例创建之后,另外指定给颜色分量,所以Color类可以处理任何颜色空间的颜色。

Color类拥有许多方法,用于支持一个被提议作为标准RGB颜色空间叫做sRGB (参考http://www.w3.org/pub/WWW/Graphics/Color/sRGB.html)。sRGB是Java 2D API的默认颜色空间。Color类定义的几个构造方法省略了ColorSpace参数。这些构造方法假定颜色的RGB值由sRGB定义,并且使用默认的ColorSpace实例来表现该空间。

Java 2D API使用sRGB是为了方便编程人员,而不是用作为颜色转换的基准颜色空间。许多应用程序主要涉及RGB图像和显示器,定义一个标准RGB颜色空间使得这里应用的写作变得容易。ColorSpace类定义了toRGBfromRGB等方法,开发人员可以轻松地从基本颜色空间获取颜色。不过,并不打算把这些方法用于高精度的颜色转换。更多信息参考“ColorSpace” on page 90

sRGB以外的颜色空间里创建颜色,可以使用Color中的以ColorSpace对象和表现适合于该空间的颜色分量的浮点数组为参数的构造方法。其中的ColorSpace对象标识其颜色空间。

要显示一个确定颜色的矩形,比如使用青色,你需要向系统描述该颜色的方法。有多种用来描述颜色的方法;例如,颜色可以描述为红、绿、蓝(RGB)分量的集合,或者青、阳红、黄和黑(CMYK)分量。这些用来表示颜色的不同技术就叫做颜色空间(color spaces)

就象你或许知道的,计算机屏幕上的颜色一般地由不同比例的红、绿、蓝光线混合而成。因此,使用RGB颜色空间作为在计算机显示器上呈像的基本空间。同样地,四色套印使用青、阳红、黄和黑色的墨水在打印纸上产生颜色;打印出来的颜色表现为CMYK颜色空间中的比例。

由于计算机显示器和彩色打印的流行,普遍使用RGB和CMYK颜色空间描述颜色。然而,两种类型的颜色空间有着与生具来的缺点—设备相关。在一台打印机上使用的青墨水可能不会与在另一台上用的青墨水完全相配。同样地,解释为RGB颜色的颜色可能在一台显示器上看是蓝色,而在另一台上看却又略带紫色。

6.2.2 经由sRGB和CIEXYZ映射颜色

Java 2D API引用RGB和CMYK作为颜色空间的类型。一个特定的显示器模型,包括它使用的荧光粉定义了它自己的RGB颜色空间。同样地,一个特定的打印机模型有它自己的CMYK颜色空间。不同的RGB或者CMYK颜色空间可以通过设备无关的颜色空间建立相互间的联系。

关于颜色的设备无关性规范的标准已经由International Commission on Illumination (CIE)作了定义。普遍使用的设备无关颜色空间是由CIE开发的3种成分(three-component)XYZ颜色空间。当你使用CIEXYZ来指定一个颜色时,你就摆脱设备相关的桎梏。

不幸的,使用CIEXYZ颜色空间描述颜色并不总是实用;其他的颜色空间也有其用来描述颜色的合理原因。要想得到一致的结果,那么当一个颜色由设备相关颜色空间比如特定的RGB空间来描绘时,就需要指明该RGB空间与设备无关(象CIEXYZ)的空间之间,是怎样的一种关系。

在颜色空间之间实现映射的一种方法是为空间对象缚上用来描述设备相关的空间怎样与设备无关的空间产生对应关系的信息。这个附加的信息叫做特征表(profile)。一个普遍应用的颜色特征表(profile)的是ICC Color Profile,由International Color Consortium定义。详细信息,参考ICC Profile Format Specification, version 3.4 available at http://www.color.org.

Figure 6-3举例说明了一个固定的颜色和一个扫描的图像是怎样被传递进人Java 2D API,他们是怎样由输出设备描述的。就象你能看到的,在Figure 6-3,不管输入色还是图像都拥有附加的特征表(profiles)。

 

using profiles to map between color spaces

 

Figure 6-3 Using Profiles to Map Between Color Spaces

6.2.2.1 Color Matching

一旦API拥有一个精确指定的颜色,它就必须在输出设备上再现该颜色,例如显示器或者打印机。这些设备拥有它们自己的、必须被统计在内以确定它们能产生正取的结果的成像特征。还有一个特征表(profile)与每个输出设备关联,用来描述怎样使那些需要转换的颜色产生出正确的结果。

要得到相容的并且精确的颜色,需要不管输入颜色还是输出设备都作出针对标准颜色空间的特征描述。比如,一个输入颜色可以从它的原始颜色空间映射到一个标准的设备无关空间,接着从这个设备无关空间映射到输出设备的颜色空间。在许多方面,颜色的转换是在模仿一个(xy)坐标空间里图形对象的转换。在这两种情况下,一个转换就是用来先指定一个“基准(standard)” 空间的坐标,然后映射那些坐标到设备指定的、用于输出的空间。

 

1当然,这些图表中用到的颜色是说明性质的,并不准确。只是为了说明,如果不使用一个合适的转换空间,颜色可能在不同颜色空间之间得不到精确的映射。

 


Contents | Previous | Next Programmer's Guide to the JavaTM 2D API
JavaTM 2 SDK, Standard Edition, 1.4 version

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值