淺析Swing Image的轉(zhuǎn)換
我覺得這種Swing Image轉(zhuǎn)換當(dāng)然可能很少會(huì)用到,不過了解一下也是沒有壞處的。
例如,我們想做一個(gè)類型于Windows的explorer的一個(gè)文件樹來顯示文件,希望每個(gè)樹結(jié)點(diǎn)的圖標(biāo)和在explorer里看到的一樣。到現(xiàn)在為此我不知道怎么用SWT去得到每個(gè)文件或文件夾的顯示圖標(biāo)。因此我要借助SWing來完成。
首先,我們需要得到一個(gè)對應(yīng)于文件(夾)圖標(biāo)的Swing Image對象。如下:
- java.awt.Image icon = ShellFolder.getShellFolder(file).getIcon(true);
接下來就是要從這個(gè)Swing Image開始做轉(zhuǎn)換。顯示不能直接把這個(gè)icon轉(zhuǎn)換成SWT的一個(gè)Image對象。所以我們需要先把這個(gè)icon變成字節(jié)流,假如我們希望轉(zhuǎn)換后圖標(biāo)的大小是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);
先轉(zhuǎn)成一個(gè)BufferedImage,然后把這個(gè)BufferedImage存入一個(gè)字符數(shù)組轉(zhuǎn)出流。最后只要從這個(gè)輸出流中得到字節(jié)數(shù)組就可以:
- byte[] by = baos.toByteArray();
這樣就得到了這個(gè)Swing圖標(biāo)對應(yīng)的一個(gè)字節(jié)數(shù)組。
要從一個(gè)字節(jié)數(shù)組得到對應(yīng)的一個(gè)SWT的圖標(biāo)就比較簡單了,我們可以先用這個(gè)數(shù)組構(gòu)造出一個(gè)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);
- }
- }
- }
這里有一點(diǎn)要注意:在沒有圖元點(diǎn)的地方,默認(rèn)會(huì)顯示一個(gè)黑點(diǎn),我把顯示黑點(diǎn)的地方都用一個(gè)白點(diǎn)做了替換。最后,根據(jù)這個(gè)data構(gòu)造出對應(yīng)的Image,如下:
- image = new Image(Display.getDefault(), data);
【編輯推薦】