2013-05-01 36 views
3

我有一個java swt應用程序。在容器的resize方法中,我想調整圖像的大小,使用下面的代碼顯示。但似乎 - 即使我處置了一切(真的?)內存消耗正在不斷增加... 我找不到我的錯誤。爲什麼和這個代碼在哪裏吃掉我所有的記憶?以Java縮放圖像Swt和內存消耗

這裏是調整大小監聽:

tabCover.addListener(SWT.Resize, new Listener() { 

     public void handleEvent(Event event) { 
      // Set images: cover_front 
      int width = tabCover.getSize().x - 30; 
      int height = tabCover.getSize().y - 30; 
      Image buffer_Coverfront; 

      buffer_Coverfront = new Image(Display.getDefault(), filename); 
      lblCoverfront.setImage(Helper.ImageScale(buffer_Coverfront, width, height)); 
      buffer_Coverfront.dispose(); 
      buffer_Coverfront = null; 

     } // handleEvent 
    }); // Listener 

而且這裏的縮放功能:

public static Image ImageScale(Image image, int width, int height) { 


    ImageData data = image.getImageData(); 

    // Some logic to keep the aspect ratio 
    float img_height = data.height; 
    float img_width = data.width; 
    float container_height = height; 
    float container_width = width; 

    float dest_height_f = container_height; 
    float factor = img_height/dest_height_f; 

    int dest_width = (int) Math.floor(img_width/factor); 
    int dest_height = (int) dest_height_f; 

    if(dest_width > container_width) { 
     dest_width = (int) container_width; 
     factor = img_width/dest_width; 
     dest_height = (int) Math.floor(img_height/factor); 

    } 

    // Image resize 
    data = data.scaledTo(dest_width, dest_height); 
    Image scaled = new Image(Display.getDefault(), data); 
    image.dispose(); 
    return scaled; 
} 

回答

2

據我可以從handleEvent(...)方法看,你忘了處理舊圖像。上述

tabCover.addListener(SWT.Resize, new Listener() { 
    public void handleEvent(Event event) { 
     // Set images: cover_front 
     int width = tabCover.getSize().x - 30; 
     int height = tabCover.getSize().y - 30; 
     Image buffer_Coverfront; 

     buffer_Coverfront = new Image(Display.getDefault(), filename); 
     Image old = lblCoverfront.getImage(); 
     lblCoverfront.setImage(Helper.ImageScale(buffer_Coverfront, width, height)); 
     buffer_Coverfront.dispose(); 
     buffer_Coverfront = null; 

     if (old != null) old.dispose(); 

    } // handleEvent 
}); // Listener 

的代碼假定控制的圖像是僅在該方法中集。如果你還來自別的地方設置初始圖像,然後將處理的條件已經被細化...

+0

謝謝,這個提示幫助。我將相關部分改爲:'Image image = new Image(Display.getDefault(),filename_front); \t \t \t \t Image scaled = Helper.ImageScale(image,width,height); \t \t \t \t lblCoverfront.setImage(scaled); \t \t \t \t image.dispose(); \t \t \t \t scaled.dispose();' – user2340162 2013-05-03 19:14:51

2

正如我不能在評論張貼代碼,那就是:

tabCover.addListener(SWT.Resize, new Listener() { 

     public void handleEvent(Event event) { 
      // Set images: cover_front 
      int width = tabCover.getSize().x - 30; 
      int height = tabCover.getSize().y - 30; 

       String filename_front = my_collection.getGlobal_path() + "Cover/" + selected_movie.getCover_front(); 

       try { 
        Image image = new Image(Display.getDefault(), filename_front); 
        Image scaled = Helper.ImageScale(image, width, height); 
        lblCoverfront.setImage(scaled); 
        image.dispose(); 
        scaled.dispose(); 

       } catch (Exception e) { 
       } // end try 

     } // handleEvent 
    }); // Listener 

再次感謝Tonny Madsen提供的有用提示。

+0

您可以通過編輯雖然問題張貼代碼... – Baz 2013-05-04 13:17:47

+1

使用SWT,我們必須記住妥善處置字體,圖像和顏色...一個非常,非常常見的錯誤。下一個領帶,看看沙... – 2013-05-04 22:04:06