我觉得这种转换当然可能很少会用到,不过了解一下也是没有坏处的。
例如,我们想做一个类型于Windows的explorer的一个文件树来显示文件,希望每个树结点的图标和在explorer里看到的一样。到现在为此我不知道怎么用SWT去得到每个文件或文件夹的显示图标。因此我要借助SWing来完成。
首先,我们需要得到一个对应于文件(夹)图标的Swing的Image对象。如下:
- java.awt.Image icon = ShellFolder.getShellFolder(file).getIcon( true );
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);
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();
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 );
- }
- }
- }
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);
image = new Image(Display.getDefault(), data);
最后效果图如下。其中为了更清楚的看到,我把图标的大小设成了32*32。