1. Jasper庫
1.1. 介紹
JasPer軟件的核心是Jasper庫。實際上,大部分Jasper的代碼都和這個庫有關系。Jasper庫提供表現圖像、色彩(色彩空間定義)和其他相關的入口類。這些類都有很好的接口,通過這些接口程序可以和類對象交互。可以使用這個餓庫來操作圖像、導入/導出各種格式的圖像并執行基本的色彩管理操作。
理論上,Jasper庫的結構在3.1中顯示。庫由兩個不同的類型代碼組成:
1. 核心代碼
2. 編碼驅動

核心代碼提供在庫上的基本框架,而編碼驅動僅僅提供編碼和解碼各種格式圖像數據的方式。所有的應用程序接口都通過核心代碼;編碼驅動僅僅被核心代碼直接調用,其他應用程序從來不需要。
Jasper庫中支持的編碼既是模塊的也是可擴展的。在核心代碼和編碼驅動之間有定義良好的接口;而且,對于新圖像格式的支持能在不修改庫的情況下很容易添加。為了這樣,新格式的編碼驅動要提供。而且,應用程序僅僅需要包含它要使用的圖像格式的編碼驅動。在這種情況下,應用程序能避免將內存花在從來都不使用的編碼驅動上。
1.2. 核心代碼
核心代碼提供下面這些關鍵的代碼。(為了避免名字沖突,所有核心代碼使用的的標識符都以jas_或JAS_前綴)。
1.2.1. 圖像類
圖像類以jas_image_t開始。這些類用來表示一個圖形。提供了下面這些方法:
1. 圖像創建/銷毀
2. 查詢通用的圖像屬性(例如:引用grid的寬度和高度,色彩)
3. 查詢組件屬性(例如:寬度、高度、grid的偏移、grid的空間、組件類型、采樣精度)
4. 設置各種圖像屬性
5. 裝載和保存圖像(例如:編碼/解碼)
6. 復制圖像
7. 添加和刪除組件
8. 讀寫組件數據
1.2.2. 色彩類
這些類以jas_cmprof_t開始。這個類用來定義色彩空間。這樣的一個定義被重定向為相關的色彩空間,例如CIE XYZ和CIE LAB。
1.2.3. 色彩轉換類
色彩轉換類以jas_cmxform_t開始。這個類用來在一個圖像數據上進行色彩空間轉換。一個色彩空間被轉換自兩個或更多的色彩。
1.2.4. 流類
以jas_stream_t開始,這個類提供類似與標準C庫的I/O流輸出;其還額外提供了Jasper庫中要求的其他代碼。這些功能包括:
1. 使用一個流(例如內存緩沖區)來關聯一個對象而不是一個文件描述符。
2. 多個字符的獲取
1.2.5. 固定點數字類
這是一個模板類(一系列的宏)提供定點數字類。用來支持基本的算法操作、類型轉換。
1.2.6. Tag值解析類
這個類以jas_tvp_t開始;這個類用來解析包含一個或多個tag的字符串。一個tag值對是一個“tag=value”形式的字符串。Tag值在Jasper的一些接口使用來傳遞參數。例如:這個對用在傳遞給編碼驅動的編碼和解碼操作的選項。
除了上面的類,還有一些其他的功能:命令行解析程序(和UNIX的getopt相似)。
1.3. 編碼驅動
核心編碼提供一個框架來house編碼驅動。一個編碼驅動提供某特殊格式圖象的編碼和解碼。每個驅動提供三個方法:
1. 一個編碼
2. 解碼
3. 驗證方法
編碼方法將某圖像(一個jas_image_t_object)版本的轉換到一個流(一個jas_stream_t_object)。解碼方法從流中的數據來創建一個圖像。驗證方法用來測試流中的數據是否符合指定的格式;這個特殊的方法一般用來自動檢測圖像特使。
Jasper發布中提供的編碼驅動是為了適應流數據;換句話說,圖像數據流一直在單個的pass中處理。這個設計理念去掉可尋找的流對象的需要。因此,寫接受和發送數據的應用程序、管道和其他不支持隨機訪問的是可能的。
1.4. 圖像模型
圖像是由一個到多個部分組成;每個部分都是由采樣的矩形數組組成。這個結構在圖3.2中描述。

每個組件的采樣值是整數值并且是有符號或無符號的1到16bit/sample。采樣數據的符號和精度按照顏色來指定的。所有這些組件和圖像中相同的空間擴展相關聯,但表示不同類型的信息。
在詮釋組件時有相當大的彈性。一個組件可以表達光譜信息(例如:彩色空間)或輔助信息(例如:一個不透明平面)。例如:一個RGB圖像有三個組件,三個組件分別和紅、綠、藍顏色面相關聯;一個RGBA(例如:帶有透明度的RGB)圖像有四個顏色面,分別和紅、綠、藍以及alpha平面相關聯。各種組件不需要以相同的分辨率來采樣;換句話說,不同組件可能有不同的采樣周期。例如:以亮度和色調表示的彩色圖像,亮度信息比色度信息更好采樣并不罕見。
由于一個圖像可以由很多組件組成,因此必須有一個描述怎么樣用這些組件來組成一個符合圖形的方法。為了這個目的,我們使用一個整數格子叫做引用網格。引用網格為一個圖像的各個組件提供一個點,并建立他們之間相對對齊的方式。
每個組件和一個矩形的采樣網格相關聯,這樣的網格通過四個參數來指定:水平偏移量、垂直偏移量、水平空間、垂直空間。一個組件的采樣被映射到采樣網格和引用網格交叉的點;這種情況下:采樣(i , j)被 映射到引用網格的(HO + iHS, VO+ jVS)。
為了澄清上面的文字,我們現在介紹一個范例。考慮一個有三個組件的圖形。對于第k個組件來說,讓我們指示水平網格偏移、垂直網格偏移、水平網格空間和垂直網格空間,分別對應于HOk、VOk、HSk、VSk。假定這些參數有下面的值:
K |
(HOk, VOk) |
(HSk, VSk) |
0 |
(0,0) |
(2,2) |
1 |
(2,3) |
(3,4) |
2 |
(3,2) |
(4,3) |
這種情況下,各組件采樣值將對齊到引用網格上,圖3.3描述。

圖中,顏色面0的坐標原點是(0,0);水平間隔是2個引用網格,垂直間隔是2個引用網格。其他同上解釋。
從上面的內容,我們可以看到Jasper的圖形模式是很普通的。使用這個模型的主要約束在于使用矩形采樣。不過大多數的應用程序都使用這個采樣。同樣使用Jasper的應用程序能夠很容易的適應灰度、彩色和其他多帶數據(使用或不使用不透明信息)。
1.5. JasPer頭文件
為了使用Jasper庫,C文件通常必須包含主要的Jasper庫的頭文件jasper/japser.h。使用下面的預編譯指令:
#include <jasper/japser.h>
主要的頭文件包含了所有其他庫的頭文件。因此,為了是應用程序隔離其他庫文件名稱的改變,應用程序僅僅應該包含主頭文件。
1.6. 初始化庫
第一次使用庫總是初始化庫。這通過調用jas_init來完成。如果在調用該函數之前調用任何其他庫函數,結構是未知的。
1.7. 內存分配
所有libjasper中的內存分配都是通過jas_malloc和jas_realloc、jas_calloc和jas_free來完成的。如果有人想要將Jasper代碼導入到嵌入式平臺,應該需要將這些函數改為指定平臺的內存分配方式,而不是malloc等。
1.8. 為新的圖形格式添加支持
支持新圖象格式的編碼引擎能很容易被添加到Jasper中,為了能夠對新文件格式的支持,必須提供下面三個函數:
1. 一個編碼函數
2. 一個解碼函數
3. 一個驗證函數
編碼函數發布一個圖像的編碼版本到流(一個jas_image_t對象到jas_stream_t對象)。解碼函數從流(jas_stream_t對象)中的編碼數據創建一個圖像(一個jas_image_t對象)。驗證函數用來快速的測試數據流是不是正確格式的圖像數據(這個函數通常用來自動檢查圖像格式)。
在編碼、解碼和驗證函數中的具體類型和參數可以通過檢查Jasper中已經存在的PNM、BMP、JPEG函數。一旦上面的函數寫好了,可以通過調用jas_image_addfmt來通知Jasper新的圖形格式引擎已經安裝。當然這個調用必須在Jasper被初始化之后調用;jas_init函數代碼給出了幾個關于如何調用jas_image_addfmt函數的例子。