SWT 圖像處理入門

Standard Widget Toolkit ( SWT ,標準窗口小部件工具箱),是在 Eclipse 平臺上使用的窗口小部件工具箱,它能向開發者提供和本機平臺一致的用戶界面和比較穩定的性能,也提供了強大的圖像處理功能。本文首先介紹 SWT 封裝的 Image , ImageData 等類,接着根據作者實際工作經驗給出了一些常見圖像處理的解決方法。

SWT 圖像處理入門

Standard Widget Toolkit ( SWT,標準窗口小部件工具箱),是在 Eclipse 平臺上使用的窗口小部件工具箱,它能向開發者提供和本機平臺一致的用戶界面和比較穩定的性能,也提供了強大的圖像處理功能。本文首先介紹 SWT 封裝的 Image, ImageData 等類,接着根據作者實際工作經驗給出了一些常見圖像處理的解決方法。





回頁首


SWT Images簡介

軟件開發人員可以利用 SWT 封裝的 Image, ImageData 等類來創建圖像、存儲圖像數據,也可以對存儲的圖像數據進行各種圖像變換。本文將演示如何正確的使用 Image, ImageData 等類,以及如何使圖像變灰、變亮/黑、圖像旋轉、圖像拉伸、圖片透明疊加、圖片反色等相關問題。

下面就來介紹一下 Image 和 ImageData 這兩個在 SWT Images 中最重要的類。

類 org.eclipse.swt.graphics.Image 被用來表示可以在設備上顯示的圖片,可以用方法如GC.drawImage() 或者 Button.setImage() 等來將它顯示出來。Image 類提供了幾個構造函數,可以完成以下功能:

  • 裝載一個現有的圖象。可以通過傳入文件名或者 InputStream 作爲參數,但是圖象的格式必須是它所支持的格式之(目前 SWT Image 支持 BMP、GIF、JPG、PNG、Windows ICO 等格式)一,否則會拋出 SWTException 異常。
  • 構造一個用已經存在的 ImageData 進行初始化的圖像。
  • 構造一個空圖像。可以通過修改其像素值或者向它拷貝一個 SWT 圖形上下文的內容 (GC) 來繪製該圖像,並且可以指定空圖像的大小。

類 org.eclipse.swt.graphics.ImageData 中存儲了圖像的像素數據信息。 ImageData 是一個包含有關圖像大小、調色板、顏色值和透明度等信息的類。我們可以對這些圖像像素數據可以直接讀或者寫操作,這意味着可以通過直接讀取或者修改圖像的數據,來設置或者取得圖像中任何像素或者任何一組像素的顏色值。關於 ImageData ,我們還應當瞭解以下一些字段:

  • width 和 height 指定圖像的寬和高。Depth 指定圖像的顏色深度。可能的值爲 1、2、4、8、16、24 或者 32,指定編碼每一個像素的值所使用的比特數。
  • alpha 與 alphaData 定義圖像的透明度。alpha 定義了圖象的全局透明度值,默認值爲 -1,否則 alphaData 域將被忽略。當 alpha 不等於 -1 時, alphaData 存儲了圖象的透明度緩衝區,每個像素可以有一個在 0~255 之間的透明度值,數值越大,表示越不透明。值得注意的是,只有部分圖象格式具有透明度,例如 GIF 和 PNG。
  • palette 包含一個 PaletteData 對象,它存儲有關圖像的顏色模型的信息。SWT 的顏色模型可以是索引或者直接的,由其域 isDirect 來指定。如果顏色模型是索引的,那麼 PaletteData 包含顏色索引,可以通過方法 getRGBs() 來獲取 RGB 信息。如果它是直接的,那麼它包含轉換信息,表明應當如何從像素的整數值中提取出顏色 RGB 成分。
  • data 包含像素值的字節緩衝區。字節編碼的方法取決於所使用的顏色深度。對於一個 8 位的圖像,數組中的一個字節正好表示圖像中一個像素的值。對於 16 位圖像,每一個像素值編碼爲緩衝區中的兩個字節。這兩個字節以最低有效字節順序存儲。對於 24 或者 32 位圖像,每一個像素值以最高有效位字節順序編碼爲緩衝區中的三個或者四個字節。
  • bytesPerLine 表明緩衝區中有多少字節用於表示圖像中一行像素的所有像素值。由於一個像素可能有多個字節表示,所以 bytesPerLine 可能是字段 width 值的若干倍。




回頁首


SWT圖象處理

常見的圖象處理包含圖象的讀/寫、圖像變灰、變亮/黑、圖像旋轉、圖像拉伸、圖片透明疊加、圖片反色等。下面將就這些問題逐個介紹,表 1 列出了各個清單所對應的圖像處理。


表 1. 示例代碼清單
代碼清單 圖像處理類型
清單 1 圖象的讀寫
清單 2 圖像變灰
清單 3 圖像變亮/變黑
清單 4 圖像旋轉
清單 5 圖像反色
清單 6 圖像拉伸
清單 7 圖片透明疊加

圖像的讀寫

我們可以使用類 org.eclipse.swt.graphics.ImageLoader 來加載或者保存圖像。 ImageLoader 具有一個全局的成員變量 ImageData[],它用於存儲圖片數據。


清單 1. 圖像讀寫示例
String fileName = "source.jpg";
String saveName = "saved.jpg";
ImageLoader loader = new ImageLoader();
ImageData[] imageData = loader.load(fileName);
if(imageData.length > 0){
Image newImage = new Image(null, imageData[0]);
//對newImage進行操作
...
loader.data[0] = newImage.getImageData();
loader.save(saveName, SWT.IMAGE_BMP);
}

圖像變灰

圖像變灰在桌面應用程序中有着廣泛的應用。例如,一個圖標被作爲一個按鈕的背景,我們需要一個灰色效果的圖標作爲按鈕的背景來表示這個按鈕處於禁用狀態。在SWT中,基於已經存在的圖像來創建一個具有灰色效果的圖像,我們可以使用構造函數 Image(Display display, Image image, int flag) 來創建,其中參數 flag 使用 SWT.IMAGE_GRAY。


清單2. 圖像變灰示例
Image newImage = new Image(null, image, SWT.IMAGE_GRAY);

圖像變亮/變黑

下面討論圖像變亮/變黑。 RGB 和 HSL (也叫 HSB/HSV )是兩種色彩空間,即:紅、綠、藍( Red, Green, Blue) 和色調、飽和度、亮度( Hue, Saturation, Lightness 或 Brightness 或 Value),前者適用於機器採樣,目前的顯示器顏色即由這三種基色構成,而後者更符合人類的直觀感覺。在 Windows 的標準顏色對話框中均包含這兩種表示方法。 RGB 的取值範圍在 0~255 之間, HSL 的取值在 0~1 之間。因此我們只需要將 HSL 空間數據的 L 分量進行調整即可調整此圖像的亮度。要實現圖像變亮/變黑的功能,只需要調整清單 3 中函數 lightImage 行(*)中等號右邊的值( 0 到 1 之間)。


清單 3. 圖像變亮示例
private static ImageData lightImage(ImageData srcData) {
double[] data = rgbTohsl(srcData.data);
byte[] newData = new byte[srcData.data.length];
int bytesPerPixel = srcData.bytesPerLine / srcData.width;
int destBytesPerLine = srcData.width * bytesPerPixel;
for(int i = 0; i < data.length; i += 3) {
data[i + 2] = 0.75; ----------------- (*)
}
data = hslTorgb(data);
for(int i = 0; i < srcData.data.length; i ++) {
newData[i] = (byte)data[i];
}
ImageData newImageData = new ImageData(srcData.width, srcData.height,
srcData.depth,srcData.palette, destBytesPerLine, newData);
return newImageData;
}

其中,方法 double[] rgbTohsl(byte[] data) 是把 RGB 空間數據轉換到 HSL 空間;相反的,方法 double[] hslTorgb(double[] data) 是把數據從 HSL 空間轉換到 RGB 空間。

圖像旋轉

清單4中方法 rotate 實現了將圖像相左旋轉 90 度。如圖 1 ,對於像素點 (x, y) ,向左旋轉90 度以後,它在圖象中的位置變成了 (y, width - x - 1) 。因此,相左旋轉 90 度即將所有的像素點按照規則換一下位置。其他的旋轉可用同樣的方法。


圖1 旋轉前與相左旋轉 90 度後


本文轉自IBM Developerworks中國

      請點擊此處查看全文

 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章