天天看點

《Java數字圖像處理:程式設計技巧與應用實踐》——2.2 Java BufferedImageOp API

本節書摘來自華章計算機《java數字圖像處理:程式設計技巧與應用實踐》一書中的第2章,第2.2節,作者 賈志剛,更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。

本節将介紹java中最常用的操作圖像像素的api接口bufferedimageop,通過它,可以實作圖像像素的調整,呈現出不同的圖像顯示效果,并且可編輯圖像内容等。

目前bufferedimageop接口中最重要的方法是filter()方法,這是所有實作類必須完成的。目前bufferedimageop有下面五個實作類。

affinetransformop :主要操作是提供各種旋轉、錯切、放縮功能。

colorconvertop :主要操作是提供像素灰階功能。

convolveop: 主要用來實作圖像卷積操作,可以實作模糊、邊緣提取等效果。

lookupop :主要用來實作圖像像素顔色的各種變換、反色等操作。

rescaleop: 主要用來實作圖像對比度與亮度的調整操作。

對應的類關系圖如圖2-2所示。

《Java數字圖像處理:程式設計技巧與應用實踐》——2.2 Java BufferedImageOp API

首先來看看如何讀取一個像素的rgb值。讀取一個像素點的rgb值的代碼如下:

其中index表示該像素點位置,row表示縱坐标位置,col表示橫坐标位置。圖像左上角的像素點對應位置坐标為(0,0),右下角的位置坐标為(height-1, width-1),這裡的height又表示圖像的高度,width表示圖像的寬度。

設定一個像素點的rgb值的代碼如下:

其中ta表示透明度的值、tr表示red通道值、tg表示green通道值、tb表示blue通道值,它們的取值範圍為[0~255]。

當建立的bufferedimage對象為argb類型,使用imageio儲存為jpg格式時,你可能會發現圖像與在swing ui中顯示的不一樣,色差很大,原因在于argb類型與jpg格式不是很相容,選擇argb時最好儲存為png格式,而rgb格式儲存為jpg格式。

當筆者初次接觸java image api時,在學習過程中遇到了各種各樣的問題。下面整理總結一下初學者經常遇到的問題。

1)圖像格式支援。很多人會用java image api來讀取tiff檔案,可惜這種格式并不被支援,在jdk6中,java imageio類隻支援幾種常見的圖像格式(png、jpg、gif、bmp),其他均不支援。

2)透明通道的支援與檔案儲存。如果bufferedimage對象為argb格式,說明支援透明通道,最佳的儲存格式為png格式,否則會造成圖像資訊丢失,儲存失真。

3)加載圖像資源檔案。很多人不知道如何加載圖像資源檔案,筆者最喜歡的做法是把要使用的圖像檔案與class檔案放在同一個package中,然後通過如下代碼加載:

4)處理結果顯示的像素裡有大片的白點或黑白斑點,最可能的原因在于你的rgb像素值取值範圍超過了[0~255],請仔細檢查。

5)如何在bufferedimage對象上繪制各種幾何形狀與文字等資訊?使用如下代碼即可:

6)如何擷取圖像的位深度?通常位深度(bit depth)與圖像存儲像素位元組位數有關系。

深度為16位通常的存儲格式為rgb,前兩個通道red與green各占5位,最後一個blue通道占6位,總計16位兩個位元組,深度為24位通常的存儲格式為rgb,分别占8位,總計三個位元組,深度為32位通常包含透明通道,且為argb格式,每個通道占1個位元組,總共32位,4個位元組。