Scaling an image in Java Swt & memory consumption

i have a java swt application. In the resize method of a container i'd like to resize the image, which is shown using the following code. However seems like - even i dispose everything (really?) the memory consumption is increasing all the time... I can't find my mistake. Why and where this code eats up all my memory?

Here is the Resize-Listener:

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

And here the scaling function:

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;
}

Answers


As far as I can see from the handleEvent(...) method, you forget to dispose the old image.

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

The code above assumes that the image of the control is only set in this method. If you also set the initial image from, somewhere else, then the condition of the disposal have to be refined...


As i can't post the code in the comment, here it is:

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

Thanks again to Tonny Madsen for the useful tip.


Need Your Help

Display Date in a Spark DataGrid

flash flex actionscript flash-builder

I have a Datagrid that gets its data from an ArrayCollection of model "beans". The ArrayCollection Outcomes is a list of Outcome

About UNIX Resources Network

Original, collect and organize Developers related documents, information and materials, contains jQuery, Html, CSS, MySQL, .NET, ASP.NET, SQL, objective-c, iPhone, Ruby on Rails, C, SQL Server, Ruby, Arrays, Regex, ASP.NET MVC, WPF, XML, Ajax, DataBase, and so on.