我覺得這種轉(zhuǎn)換當然可能很少會用到,不過了解一下也是沒有壞處的。
?
例如,我們想做一個類型于Windows的explorer的一個文件樹來顯示文件,希望每個樹結(jié)點的圖標和在explorer里看到的一樣。到現(xiàn)在為此我不知道怎么用SWT去得到每個文件或文件夾的顯示圖標。因此我要借助SWing來完成。
?
首先,我們需要得到一個對應于文件(夾)圖標的Swing的Image對象。如下:
?
- java.awt.Image?icon?=?ShellFolder.getShellFolder(file).getIcon( true );??
java.awt.Image icon = ShellFolder.getShellFolder(file).getIcon(true);
?
?
接下來就是要從這個Swing的Image開始做轉(zhuǎn)換。顯示不能直接把這個icon轉(zhuǎn)換成SWT的一個Image對象。所以我們需要先把這個icon變成字節(jié)流,假如我們希望轉(zhuǎn)換后圖標的大小是16*16。那么,可以如下做:
?
- int ?width?=? 16 ; ??
- int ?height?=? 16 ; ??
- BufferedImage?b?=? new ?BufferedImage(width,?height, ??
- ????????BufferedImage.TYPE_INT_RGB); ??
- Graphics?graphics?=?b.getGraphics(); ??
- graphics.drawImage(icon,? 0 ,? 0 ,?width,?height,? null ); ??
- ByteArrayOutputStream?baos?=? new ?ByteArrayOutputStream(); ??
- ImageIO.write(b,? "png" ,?baos);??
int width = 16; int height = 16; BufferedImage b = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); Graphics graphics = b.getGraphics(); graphics.drawImage(icon, 0, 0, width, height, null); ByteArrayOutputStream baos = new ByteArrayOutputStream(); ImageIO.write(b, "png", baos);
?
?
先轉(zhuǎn)成一個BufferedImage,然后把這個BufferedImage存入一個字符數(shù)組轉(zhuǎn)出流。最后只要從這個輸出流中得到字節(jié)數(shù)組就可以:
?
- byte []?by?=?baos.toByteArray();??
byte[] by = baos.toByteArray();
?
這樣就得到了這個Swing圖標對應的一個字節(jié)數(shù)組。
?
要從一個字節(jié)數(shù)組得到對應的一個SWT的圖標就比較簡單了,我們可以先用這個數(shù)組構(gòu)造出一個ImageData對象,如下:
- ImageData?data?=? new ?ImageData( new ?ByteArrayInputStream(by)); ??
- for ?( int ?i?=? 0 ;?i?<?width;?i++)?{ ??
- ???? for ?( int ?j?=? 0 ;?j?<?height;?j++)?{ ??
- ???????? if ?(data.getPixel(i,?j)?==? 0 )?{ ??
- ????????????data.setPixel(i,?j,? 0xffffff ); ??
- ????????} ??
- ????} ??
- }??
ImageData data = new ImageData(new ByteArrayInputStream(by)); for (int i = 0; i < width; i++) { for (int j = 0; j < height; j++) { if (data.getPixel(i, j) == 0) { data.setPixel(i, j, 0xffffff); } } }
?這里有一點要注意:在沒有圖元點的地方,默認會顯示一個黑點,我把顯示黑點的地方都用一個白點做了替換。最后,根據(jù)這個data構(gòu)造出對應的Image,如下:
- image?=? new ?Image(Display.getDefault(),?data);??
image = new Image(Display.getDefault(), data);
?
最后效果圖如下。其中為了更清楚的看到,我把圖標的大小設成了32*32。
更多文章、技術交流、商務合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
