把Swing的Icon转换到SWT的Image(续)

简介:
+关注继续查看
在上一篇《把Swing的Icon转换到SWT的Image》文章的最后留下了一个小尾巴,也就是图片转换的效果虽然也是不错,但是比起原图来,还是有一点差距,眼神好的还是一眼就可以看出来,对于我这样精益求精的人来说总是心里觉得不爽。
这个问题很快就得到了解决。不过不是我刻意用心去寻找解决方案的,而是那一天想找个从dll文件里面提取图标的方法,找来找去,赫然在SWT的官方网站上找到了个例程,其名字就叫做:convert between SWT Image and AWT BufferedImage,TNND,真是无心插柳啊。不过话说回来,这也是典型的灯下黑,当时为了找图片格式转换的方法,在网上搜个昏天黑地的,又试验了各种方法,最后才得到一个不算完美的方法,结果,其实真正完美的解决办法敌人早就放在官方例程里面了。嗯,教训啊。
废话少说,先看下面的图:
002
左边是从资源管理器截的图,右边是我上一篇文章最后的解决方案转换后生成的图片,可以看到的确还是有个别像素点转换的有问题,convert between SWT Image and AWT BufferedImage的转换代码如下(我配合我的程序,做了一点小小修改,不过关键算法部分没有任何改动):
public static Image getSWTImageFromSwing(ImageIcon imageIcon)
 
{
 
    if (imageIcon.getImage() instanceof BufferedImage)
 
    {
 
       BufferedImage bufferedImage = (BufferedImage) imageIcon.getImage();
 
      
 
       DirectColorModel colorModel = (DirectColorModel)bufferedImage.getColorModel();
 
       PaletteData palette = new PaletteData(colorModel.getRedMask(), colorModel.getGreenMask(), colorModel.getBlueMask());
 
       ImageData data = new ImageData(bufferedImage.getWidth(), bufferedImage.getHeight(), colorModel.getPixelSize(), palette);
 
      
 
       //设置每个像素点的颜色与Alpha
 
       for (int y = 0; y < data.height; y++) {
 
           for (int x = 0; x &lt; data.width; x++) {
 
              int rgb = bufferedImage.getRGB(x, y);
 
              int pixel = palette.getPixel(new RGB((rgb >> 16) & 0xFF, (rgb >> 8) & 0xFF, rgb & 0xFF));
 
              data.setPixel(x, y, pixel);
 
              if (colorModel.hasAlpha()) {
 
                  data.setAlpha(x, y, (rgb &gt;&gt; 24) & 0xFF);
 
              }
 
           }
 
       }
 
 
       // 生成Image对象
 
       Image swtImage = new Image(PlatformUI.getWorkbench().getDisplay(),
 
              data);
 
       return swtImage;
 
    }
 
}
当我看到这个代码的时候,感觉简直太优美了,完全是根据颜色处理的规则来的,没有什么硬生生设置没有颜色的像素点颜色为白色的丑陋代码。转换的效果也非常完美,跟资源管理器里面的截图也是一模一样。早要是到SWT官方网站上看一眼多好。
我的运行环境是:Windows7、JRE1.6、Eclipse RCP 3.5。





本文转自 tywali 51CTO博客,原文链接:http://blog.51cto.com/lancelot/336448,如需转载请自行联系原作者
目录
相关文章
|
8月前
|
Linux
解决办法:gtk_image_menu_item_set_image()菜单图标无法显示
解决办法:gtk_image_menu_item_set_image()菜单图标无法显示
32 0
|
前端开发 JavaScript 小程序
SVG格式的Icon,用了你就知道有多香
继阿里的iconfont之后,字节跳动也出品了自己的矢量图标库,可以实现根据单一SVG源文件变换出多种主题, 具备丰富的分类、更轻量的代码和更灵活的使用场景。
364 0
SVG格式的Icon,用了你就知道有多香
Java_Swing中让窗口居中显示的方法(三种方法)
Java_Swing中让窗口居中显示的方法(三种方法)
406 0
|
C# Windows
C# 获取系统Icon、获取文件相关的Icon
原文:C# 获取系统Icon、获取文件相关的Icon 1、获取系统Icon 工具下载SystemIcon.exe using System; using System.Collections.
2163 0
|
Shell
SWT里Slider和Scale的区别
以前以为Slider和Scale之间只是外观的区别,今天发现不是这样的,因为Slider有一个特点:getSelection()能得到的最 大值并不是getMaximum()的值,要减去getThumb()值,后者是中间的滑块所拥有的值,缺省为10,最小为1。
1204 0
|
前端开发 Android开发
在SWT里显示AWT对象
今天遇到一个问题,就是要在一个Eclipse插件里显示JFreeChart的图形,因为后者是基于Java2D的,要把图形显示在SWT应用程序里需要利用SWT-AWT桥接器来实现,虽说桥接的方式多半会伴随着性能下降,但总归是一个解决方法。
1258 0
pi4j,Netbeans中togglebutton跟Jbutton的区别
一组togglebutton中会始终有一个是按下去的状态 一组commandbutton就全部都始终都是弹起的状态
1251 0
相关产品
机器翻译
推荐文章
更多