亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

SWT圖像處理入門

系統(tǒng) 1915 0

Standard Widget Toolkit ( SWT ,標(biāo)準(zhǔn)窗口小部件工具箱),是在 Eclipse 平臺(tái)上使用的窗口小部件工具箱,它能向開發(fā)者提供和本機(jī)平臺(tái)一致的用戶界面和比較穩(wěn)定的性能,也提供了強(qiáng)大的圖像處理功能。本文首先介紹 SWT 封裝的 Image , ImageData 等類,接著根據(jù)作者實(shí)際工作經(jīng)驗(yàn)給出了一些常見圖像處理的解決方法。

<!--START RESERVED FOR FUTURE USE INCLUDE FILES--><!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters --> <!--END RESERVED FOR FUTURE USE INCLUDE FILES-->

SWT 圖像處理入門


Standard Widget Toolkit ( SWT,標(biāo)準(zhǔn)窗口小部件工具箱),是在 Eclipse 平臺(tái)上使用的窗口小部件工具箱,它能向開發(fā)者提供和本機(jī)平臺(tái)一致的用戶界面和比較穩(wěn)定的性能,也提供了強(qiáng)大的圖像處理功能。本文首先介紹 SWT 封裝的 Image, ImageData 等類,接著根據(jù)作者實(shí)際工作經(jīng)驗(yàn)給出了一些常見圖像處理的解決方法。


SWT Images簡(jiǎn)介

軟件開發(fā)人員可以利用 SWT 封裝的 Image, ImageData 等類來(lái)創(chuàng)建圖像、存儲(chǔ)圖像數(shù)據(jù),也可以對(duì)存儲(chǔ)的圖像數(shù)據(jù)進(jìn)行各種圖像變換。本文將演示如何正確的使用 Image, ImageData 等類,以及如何使圖像變灰、變亮/黑、圖像旋轉(zhuǎn)、圖像拉伸、圖片透明疊加、圖片反色等相關(guān)問題。

下面就來(lái)介紹一下 Image 和 ImageData 這兩個(gè)在 SWT Images 中最重要的類。

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

  • 裝載一個(gè)現(xiàn)有的圖象。可以通過傳入文件名或者 InputStream 作為參數(shù),但是圖象的格式必須是它所支持的格式之(目前 SWT Image 支持 BMP、GIF、JPG、PNG、Windows ICO 等格式)一,否則會(huì)拋出 SWTException 異常。
  • 構(gòu)造一個(gè)用已經(jīng)存在的 ImageData 進(jìn)行初始化的圖像。
  • 構(gòu)造一個(gè)空?qǐng)D像。可以通過修改其像素值或者向它拷貝一個(gè) SWT 圖形上下文的內(nèi)容 (GC) 來(lái)繪制該圖像,并且可以指定空?qǐng)D像的大小。

類 org.eclipse.swt.graphics.ImageData 中存儲(chǔ)了圖像的像素?cái)?shù)據(jù)信息。 ImageData 是一個(gè)包含有關(guān)圖像大小、調(diào)色板、顏色值和透明度等信息的類。我們可以對(duì)這些圖像像素?cái)?shù)據(jù)可以直接讀或者寫操作,這意味著可以通過直接讀取或者修改圖像的 數(shù)據(jù),來(lái)設(shè)置或者取得圖像中任何像素或者任何一組像素的顏色值。關(guān)于 ImageData ,我們還應(yīng)當(dāng)了解以下一些字段:

  • width 和 height 指定圖像的寬和高。Depth 指定圖像的顏色深度??赡艿闹禐?1、2、4、8、16、24 或者 32,指定編碼每一個(gè)像素的值所使用的比特?cái)?shù)。
  • alpha 與 alphaData 定義圖像的透明度。alpha 定義了圖象的全局透明度值,默認(rèn)值為 -1,否則 alphaData 域?qū)⒈缓雎?。?dāng) alpha 不等于 -1 時(shí), alphaData 存儲(chǔ)了圖象的透明度緩沖區(qū),每個(gè)像素可以有一個(gè)在 0~255 之間的透明度值,數(shù)值越大,表示越不透明。值得注意的是,只有部分圖象格式具有透明度,例如 GIF 和 PNG。
  • palette 包含一個(gè) PaletteData 對(duì)象,它存儲(chǔ)有關(guān)圖像的顏色模型的信息。SWT 的顏色模型可以是索引或者直接的,由其域 isDirect 來(lái)指定。如果顏色模型是索引的,那么 PaletteData 包含顏色索引,可以通過方法 getRGBs() 來(lái)獲取 RGB 信息。如果它是直接的,那么它包含轉(zhuǎn)換信息,表明應(yīng)當(dāng)如何從像素的整數(shù)值中提取出顏色 RGB 成分。
  • data 包含像素值的字節(jié)緩沖區(qū)。字節(jié)編碼的方法取決于所使用的顏色深度。對(duì)于一個(gè) 8 位的圖像,數(shù)組中的一個(gè)字節(jié)正好表示圖像中一個(gè)像素的值。對(duì)于 16 位圖像,每一個(gè)像素值編碼為緩沖區(qū)中的兩個(gè)字節(jié)。這兩個(gè)字節(jié)以最低有效字節(jié)順序存儲(chǔ)。對(duì)于 24 或者 32 位圖像,每一個(gè)像素值以最高有效位字節(jié)順序編碼為緩沖區(qū)中的三個(gè)或者四個(gè)字節(jié)。
  • bytesPerLine 表明緩沖區(qū)中有多少字節(jié)用于表示圖像中一行像素的所有像素值。由于一個(gè)像素可能有多個(gè)字節(jié)表示,所以 bytesPerLine 可能是字段 width 值的若干倍。




SWT圖象處理

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


表 1. 示例代碼清單

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

圖像的讀寫

我們可以使用類 org.eclipse.swt.graphics.ImageLoader 來(lái)加載或者保存圖像。 ImageLoader 具有一個(gè)全局的成員變量 ImageData[],它用于存儲(chǔ)圖片數(shù)據(jù)。


清單 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]);
//對(duì)newImage進(jìn)行操作
...
loader.data[0] = newImage.getImageData();
loader.save(saveName, SWT.IMAGE_BMP);
}

圖像變灰

圖像變灰在桌面應(yīng)用程序中有著廣泛的應(yīng)用。例如,一個(gè)圖標(biāo)被作為一個(gè)按鈕的背景,我們需要一個(gè)灰色效果的圖標(biāo)作為按鈕的背景來(lái)表示這個(gè)按鈕處于禁用 狀態(tài)。在SWT中,基于已經(jīng)存在的圖像來(lái)創(chuàng)建一個(gè)具有灰色效果的圖像,我們可以使用構(gòu)造函數(shù) Image(Display display, Image image, int flag) 來(lái)創(chuàng)建,其中參數(shù) flag 使用 SWT.IMAGE_GRAY。


清單2. 圖像變灰示例

            Image newImage = new Image(null, image, SWT.IMAGE_GRAY);
            

圖像變亮/變黑

下面討論圖像變亮/變黑。 RGB 和 HSL (也叫 HSB/HSV )是兩種色彩空間,即:紅、綠、藍(lán)( Red, Green, Blue) 和色調(diào)、飽和度、亮度( Hue, Saturation, Lightness 或 Brightness 或 Value),前者適用于機(jī)器采樣,目前的顯示器顏色即由這三種基色構(gòu)成,而后者更符合人類的直觀感覺。在 Windows 的標(biāo)準(zhǔn)顏色對(duì)話框中均包含這兩種表示方法。 RGB 的取值范圍在 0~255 之間, HSL 的取值在 0~1 之間。因此我們只需要將 HSL 空間數(shù)據(jù)的 L 分量進(jìn)行調(diào)整即可調(diào)整此圖像的亮度。要實(shí)現(xiàn)圖像變亮/變黑的功能,只需要調(diào)整清單 3 中函數(shù) lightImage 行(*)中等號(hào)右邊的值( 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 空間數(shù)據(jù)轉(zhuǎn)換到 HSL 空間;相反的,方法 double[] hslTorgb(double[] data) 是把數(shù)據(jù)從 HSL 空間轉(zhuǎn)換到 RGB 空間。

圖像旋轉(zhuǎn)

清單4中方法 rotate 實(shí)現(xiàn)了將圖像相左旋轉(zhuǎn) 90 度。如圖 1 ,對(duì)于像素點(diǎn) (x, y) ,向左旋轉(zhuǎn)90 度以后,它在圖象中的位置變成了 (y, width - x - 1) 。因此,相左旋轉(zhuǎn) 90 度即將所有的像素點(diǎn)按照規(guī)則換一下位置。其他的旋轉(zhuǎn)可用同樣的方法。


圖1 旋轉(zhuǎn)前與相左旋轉(zhuǎn) 90 度后
旋轉(zhuǎn)前與相左旋轉(zhuǎn) 90 度后

清單4. 圖像旋轉(zhuǎn)示例

            private static ImageData rotate(ImageData srcData) {
            
int bytesPerPixel = srcData.bytesPerLine / srcData.width;
int destBytesPerLine = srcData.height * bytesPerPixel;
byte[] newData = new byte[srcData.data.length];
int width = 0, height = 0;
for (int srcY = 0; srcY < srcData.height; srcY++) {
for (int srcX = 0; srcX < srcData.width; srcX++) {
int destX = 0, destY = 0, destIndex = 0, srcIndex = 0;
destX = srcY;
destY = srcData.width - srcX - 1;
width = srcData.height;
height = srcData.width;
destIndex = (destY * destBytesPerLine) + (destX * bytesPerPixel);
srcIndex = (srcY * srcData.bytesPerLine) + (srcX * bytesPerPixel);
System.arraycopy(srcData.data, srcIndex, newData, destIndex, bytesPerPixel);
}
}

return new ImageData(width, height, srcData.depth, srcData.palette,
destBytesPerLine, newData);
}

圖像反色

對(duì)于彩色圖像的 R、G、B 各彩色分量取反的技術(shù)就是圖像的反色處理,這在處理二值化圖像的連通區(qū)域選取的時(shí)候非常重要。如物體連通域用黑色表示,而二值化后的物體連通域圖像可那是 白色的,而背景是黑色的,這時(shí)應(yīng)手動(dòng)選取圖像的反色處理或有程序根據(jù)背景和物體連通域兩種顏色的數(shù)量所占比例而自動(dòng)選擇是否選擇選取圖像的反色處理,其算 法很簡(jiǎn)單,假設(shè)源圖像一像素的紅,綠,藍(lán)分量為 (R,G,B),則目標(biāo)圖像該像素的紅綠藍(lán)分量應(yīng)變?yōu)?(255 - R,255 - G, 255 - B)。


清單5. 圖像反色示例

            private static ImageData reverseImage(ImageData srcData)
            
{
int bytesPerPixel = srcData.bytesPerLine / srcData.width;
int destBytesPerLine = srcData.width * bytesPerPixel;
byte[] newData = srcData.data;

for (int i = 0; i < newData.length; i ++)
newData[i] = (byte) (255 - newData[i]);
ImageData newImageData = new ImageData(srcData.width, srcData.height,
srcData.depth, srcData.palette, destBytesPerLine, newData);
newImageData.transparentPixel = srcData.transparentPixel;

return newImageData;
}

圖像拉伸

圖像的縮小/放大一般分為按比例縮小和不按比例縮小兩種。圖像的縮小操作中,是在現(xiàn)有的信息里如何挑選所需要的有用信息。圖像的放大操作中,則需對(duì) 尺寸放大后所多出來(lái)的空格填入適當(dāng)?shù)闹担@是信息的估計(jì)問題,所以較圖像的縮小要難一些,而且圖像大比例放大時(shí)經(jīng)常會(huì)出現(xiàn)馬賽克效應(yīng)。慶幸的是,SWT 工具箱對(duì)圖像的拉伸進(jìn)行了封裝,開發(fā)者只需要調(diào)用方法 ImageData.scaledTo(int width, int height) 來(lái)獲得一個(gè)拉伸后的 ImageData。


清單6. 圖像拉伸示例

            Image newImage = new Image(null, imageData[0].scaledTo(imageData[0].width / 2,
            
imageData[0].height / 2));

圖片透明疊加

透明疊加方式是圖象處理中常用的一種處理方式,在這種處理方式中,一幅圖片疊加到另一幅圖片上,但是這幅圖象不是完全將原來(lái)的圖象覆蓋,而是能夠部 分的透過疊加的圖象顯示出來(lái),透明的程度由透明度參數(shù)指定(假定為 a,其值在 0 與 1 之間,數(shù)值越小表明被疊加的圖片越透明),其原理是目標(biāo)圖片的 R、G、B 以及 alpha 分別為待疊加圖片 1 的 R、G、B 以及 alpha 分量乘以透明度參數(shù) a 加上待疊加圖片 2 的 R、G、B 以及 alpha 分量乘以 1-a 的值。我們可以使用圖片的透明疊加作出水印的效果。


清單7. 圖像透明疊加示例

            private static ImageData watermark(ImageData srcData1, ImageData srcData2, double alpha) {
            
if(srcData1.width != srcData2.width || srcData1.height !=
srcData2.height || rcData1.bytesPerLine != srcData2.bytesPerLine)
//未考慮不同大小圖片的疊加
return null;
int bytesPerPixe = srcData1.bytesPerLine / srcData1.width;
int destBytesPerLine = srcData1.width * bytesPerPixe;
byte[] newData = new byte[srcData1.data.length];

ImageData newImageData = new ImageData(srcData1.width, srcData1.height, srcData1.depth,
srcData1.palette, destBytesPerLine, newData);
for (int srcY = 0; srcY < srcData1.height; srcY++) {
for (int srcX = 0; srcX < srcData1.bytesPerLine; srcX++) {
int idx = srcY * srcData1.bytesPerLine + srcX;
newImageData.data[idx] = (byte)(alpha * srcData1.data[idx] +
(1- alpha) * srcData2.data[idx]);
}
}
return newImageData;
}

需要說(shuō)明的是,以上所列舉的清單中大部分都沒有對(duì)透明度數(shù)據(jù)進(jìn)行處理, 讀者如對(duì)帶有透明度數(shù)據(jù)圖片進(jìn)行處理的時(shí)候,可自行添加相關(guān)代碼 ,其處理過程跟對(duì) ImageData 數(shù)據(jù)處理過程類似。




結(jié)論

從上面的介紹中,可以知道 SWT 對(duì) Image 的支持非常好,開發(fā)者可以方便的對(duì)圖象進(jìn)行各種操作。對(duì)于想用 Java 來(lái)進(jìn)行圖像處理的編程人員來(lái)說(shuō), SWT Images 是一個(gè)不可多得選擇。

SWT圖像處理入門


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦?。?!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 激情五月综合婷婷 | 国产福利99 | 国产精品免费观看视频 | 热99这里只有精品 | 成在线人免费视频一区二区三区 | 欧美片欧美日韩国产综合片 | 欧美黑人激情性久久 | 免费观看毛片 | 日韩免费一级毛片 | 成人欧美一区二区三区黑人妖 | 日韩成人免费aa在线看 | 久久国产精品一国产精品 | 五月四房婷婷 | 综合图片区 | 狠狠色丁香婷婷综合视频 | 在线精品国产第一页 | 视频一区二区欧美日韩在线 | 国产乱人伦偷精品视频不卡 | 久久入| 午夜黄色影院 | 欧美色视频日本片高清在线观看 | 婷婷中文| 成人国产精品一级毛片天堂 | 亚洲国产精品一区二区不卡 | 一级特黄牲大片免费视频 | 亚洲人妖女同在线播放 | 中文字幕亚洲 综合久久 | 国产精品福利一区二区 | 在线性爱视频 | 亚洲第一区二区快射影院 | 亚洲天堂国产精品 | 成人人观看的免费毛片 | 国产一区国产二区国产三区 | 亚洲精品αv一区二区三区 亚洲精品爱爱久久 | 国产精品久久一区二区三区 | 成人欧美一区在线视频在线观看 | 婷婷亚洲国产成人精品性色 | 欧美一级α片毛片免费观看 | 国产精品国色综合久久 | 欧洲自拍偷拍 | 日本一级淫一片免费 |