870920 Menu

JUCE图像处理之Image及相关类2-1

本小节主要讨论以下3个类:

  • Image 图像
  • ImageCache 图像缓存
  • ImageFileFormat 读写图像数据(其下有3个派生类)

计算机绘制(显示)的原理是直接操纵屏幕上的像素,每个像素可由1字节(Alpha)、3字节(RGB)、4字节(ARGB)数据构成,一组按既定方式排列组合的像素数据可构成一副大小固定的图像。用面向对象的方式理解,Image类就可以代表这副图像的基本描述与模型蓝本。亦即:一个Image对象的实质是持有一组像素数据的集合,该集合可代表一副图像。

Image采用了两种图像格式:24位RGB或32位ARGB,区别是该像素点是否具有Alpha属性。Image可对所持有的图像进行基本的操作处理。

下面这条语句可创建一个大小为500*500的纯黑色图像:

Image对象创建后,只是一块黑色或透明的区域,并没有任何内容。其内容可由Graphics图形环境(画刷)来绘制或填充。即:可临时创建一个Graphics类的对象,以Image对象初始化之,而后对Image对象进行绘制。此时,要绘制Image的Graphics对象通常临时定义为栈对象,其构造参数为需要绘制的Image对象,而不是组件类paint()函数的1参(Graphics& g),这一点一定要区分清楚。

组件类paint()函数的1参g为全局引用型对象,是JUCE系统内部的图形渲染环境,该对象并不由用户定义的Image对象来初始化。但可利用paint()函数的Graphics&对象平铺或显示自定义的Image图像:

另一例创建和处理图像的代码:

1参为Rectangle矩形的引用型对象,某个组件调用getBounds()等函数后,可返回一个Rectangle对象。也可手工指定矩形对象,比如:Rectangle (x起点, y起点, 宽度, 高度);

在进一步操作处理图像之前,先了解一下如何获取图像。

有两种常规途径:使用ImageCache图像缓存类,或者ImageFileFormat加载图像文件类。ImageCache类使用全局性的图像缓存技术,程序中可能在多处加载并使用同一个图像,这种情况下可采取共享策略,而不是每次都将该图像复制并加载到内存中。并且,图像释放之后,在实际销毁之前,还可在内存中保留一段时间。因此,如果重复加载和删除同一个图像,使用ImageCache类可大幅度提升性能。ImageCache类有5个public函数,全部静态。

如果所需的图像只是临时加载并显示一次,则使用ImageFileFormat类即可。

示例:

除了上面两个静态函数,ImageCache类还有三个静态函数:
 addImageToCache () 将某个图像添加到缓存中,指定其哈希码
 getFromHashCode () 基于addImageToCache()添加图像时所指定的哈希码返回该图像
 setCacheTimeout () 不使用图像时,过多久才从缓存中移除该图像。默认5秒

setCacheTimeout()可在主程序类的初始化函数initialise()中指明全局性的图像缓存超时时间:

加载图像还可使用ImageFileFormat类,该类是一个抽象基类,不仅可以用于加载图像文件 ,还可将Image对象保存为磁盘上的图像文件。ImageFileFormat类的静态函数为:
 findImageFormatForStream () 返回输入流对象中的图像格式
 loadFrom () 尝试加载输入流对象、磁盘文件或内存块中的图像

如要将Image写入磁盘文件,则根据图像的压缩格式,选择ImageFileFormat类的派生类来完成此事。其派生类有3个,分别对应JUCE类库所能识别并处理的3种图像压缩格式:PNG、JPEG、GIF。注:JUCE类库虽然可以识别并绘制GIF格式的图像,但无法实现GIF图像的动画效果。

这3个派生类是:GIFImageFormat、JPEGImageFormat、PNGImageFormat,它们实现了抽象基类ImageFileFormat类的纯虚函数,且均未添加新的函数。所实现的纯虚函数为:
 getFormatName () 返回此文件格式的文本描述
 canUnderstand () 如果给出的数据流包含此格式能够识别的数据,则返回true
 decodeImage () 尝试将给出的输入流对象进行解码,并返回一幅图像
 writeImageToStream () 将1参Image图像写入2参输出流对象中