把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 p_w_picpathIcon)
 
{
 
    if (p_w_picpathIcon.getImage() instanceof BufferedImage)
 
    {
 
       BufferedImage bufferedImage = (BufferedImage) p_w_picpathIcon.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官方網站上看一眼多好。
個人運行環境是:Windows七、JRE1.六、Eclipse RCP 3.5。
相關文章
相關標籤/搜索