本節書摘來自華章計算機《java數字圖像處理:程式設計技巧與應用實踐》一書中的第2章,第2.3節,作者 賈志剛,更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。
通過前面兩節的學習,我們已經大緻了解bufferedimageop接口及其實作類的功能。實踐出真知,本節将示範bufferedimageop接口中每個實作類的實際使用場景,達到知行合一、學以緻用的目的,幫助大家解決項目中遇到的實際問題。為了讓大家對應用效果有更加深刻的印象,下面會使用bufferedimageop的實作類來實作如下幾個濾鏡特效功能。
黑白濾鏡:将彩色圖像自動轉換為黑白兩色圖像。
灰階濾鏡:将彩色圖像自動轉換為灰階圖像。
模糊濾鏡:使圖像産生模糊效果。
放縮濾鏡:使圖像放大或縮小。
1 . ui實作部分
在介紹基于swing的ui實作時,關于swing ui部分的程式設計知識将在下一章中詳細剖析與解釋,本節的重點放在濾鏡實作部分,大緻的ui布局如圖2-3所示。

2.濾鏡部分的實作
(1)colorconvertop實作灰階功能
colorconvertop主要用于實作各種色彩空間的轉換,進而達到轉換bufferedimage對象類型的目的,也可以在執行個體化colorconvertop對象時指定色彩空間。目前支援的色彩空間有五種,實作灰階功能時,隻需在執行個體化colorconvertop時指定色彩空間為colorspace.cs_gray,然後調用它的filter方法得到傳回圖像即可。灰階化的源代碼如下:
(2)lookupop 實作黑白功能
lookupop在執行個體化時需要傳入lookuptable執行個體,目前lookuptable接口的兩個實作類分别為bytelookuptable與shortlookuptable。類關系圖2-4可以很好地說明它們之間的關系。
運用lookupop實作彩色圖像變成黑白單色圖像的功能時,首先要将圖像灰階化,然後針對灰階圖像在lookuptable中根據像素值進行索引查找,以便設定新的像素值,進而得到黑白單色圖像,代碼如下:
(3)convolveop 實作模糊功能
convolveop是實作模闆卷積功能操作的類,通過簡單設定卷積核/卷積模闆就可以實作圖像模糊功能,實作代碼如下:
但是當你想對大多數jpg格式圖檔的bufferedimage對象實作模糊功能時,很多情況下java會抛出如下錯誤消息:
原因在于jdk讀入jpg格式圖像時,多數情況下使用了type_3byte_bgr存儲方式,而bufferedimageop實作的濾鏡不支援操作該存儲方式的bufferedimage對象,這樣就導緻了上面的錯誤。解決之道很簡單,就是通過colorconvertop把圖像從類型type_3byte_bgr轉換為type_int_rgb的bufferedimage對象。是以模糊功能的完整源代碼如下:
converttype方法的代碼如下:
(4)affinetransformop實作圖像zoom in/out的功能
affinetransformop支援的操作包括圖像的錯切、旋轉、放縮、平移。要實作圖像的放縮功能,首先要通過affinetransform.getscaleinstance來擷取scale執行個體,然後作為參數初始化affinetransformop對象執行個體,最後調用filter方法即可。實作圖像放縮功能的代碼如下:
需要傳入的三個參數包括:bi是bufferedimage對象執行個體,代表要放縮的圖像;sx表示在x方向的放縮比率;sy表示在y方向的放縮比率。
完整的ui部分代碼如下:
這裡主要是基于jframe對象實作ui部分,通過重載jpanel的paintcomponent()方法來顯示原圖與處理後的效果圖。按鈕動作響應通過監聽actionlistener來實作,處理完以後通過調用repaint()方法來實作ui重新整理。