在上一篇
《把Swing的Icon转换到SWT的Image》文章的最后留下了一个小尾巴,也就是图片转换的效果虽然也是不错,但是比起原图来,还是有一点差距,眼神好的还是一眼就可以看出来,对于我这样精益求精的人来说总是心里觉得不爽。
这个问题很快就得到了解决。不过不是我刻意用心去寻找解决方案的,而是那一天想找个从dll文件里面提取图标的方法,找来找去,赫然在SWT的官方网站上找到了个例程,其名字就叫做:
convert between SWT Image and AWT BufferedImage,TNND,真是无心插柳啊。不过话说回来,这也是典型的灯下黑,当时为了找图片格式转换的方法,在网上搜个昏天黑地的,又试验了各种方法,最后才得到一个不算完美的方法,结果,其实真正完美的解决办法敌人早就放在官方例程里面了。嗯,教训啊。
废话少说,先看下面的图:
左边是从资源管理器截的图,右边是我上一篇文章最后的解决方案转换后生成的图片,可以看到的确还是有个别像素点转换的有问题,
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 < 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 >> 24) & 0xFF);
}
}
}
//
生成
Image
对象
Image swtImage =
new
Image(PlatformUI.getWorkbench().getDisplay(),
data);
return
swtImage;
}
}
|
当我看到这个代码的时候,感觉简直太优美了,完全是根据颜色处理的规则来的,没有什么硬生生设置没有颜色的像素点颜色为白色的丑陋代码。转换的效果也非常完美,跟资源管理器里面的截图也是一模一样。早要是到SWT官方网站上看一眼多好。
我的运行环境是:Windows7、JRE1.6、Eclipse RCP 3.5。