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