为什么显示.GIF图像会不断增加内存? [英] why showing .GIF image increase memory continuously?

查看:91
本文介绍了为什么显示.GIF图像会不断增加内存?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在显示简单的代码示例.我在Jlabel中显示了gif图像.运行程序时,TASK管理器显示内存正在不断增加.为什么会发生?

i am showing simple code sample. I showed an gif image in a Jlabel. When run the programme, TASK manager shows that memory is increasing continuously. Why it happens?

请尝试此代码...在显示玻璃按钮上,玻璃面板上显示gif图像,并在其中隐藏玻璃按钮,并且该内存将开始增加.单击隐藏玻璃"按钮后,玻璃面板将被隐藏,内存增加将停止.

try this code please... on show glass button, glass panel is shown with gif image and a hide glass button in it and with that memory will be started increasing. On clicking hide glass button, glass panel will be hidden and memory increasing will b stopped.

@mKorbel:我已经调试了它,构造函数将被调用一次,因此无需重新初始化JFrame并包括:setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

@mKorbel : I had debugged it, the constructor will be called once, so no re-initializing of JFrame and also included : setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

public class circle extends JFrame {
public ImageIcon pic;
final JPanel glass;
public JButton glass_show;
public JButton hide_glass;

public circle() {
    super("Hi shamansdsdsd");
    setSize(500, 300);
    // Image icon initialize once :
    pic = new ImageIcon("images/loadinag.gif");
    glass_show = new JButton("Show Glass panel");
    this.add(glass_show);

    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    glass = (JPanel) this.getGlassPane();
    hide_glass = new JButton("Hide Glass panel");
    glass.add(hide_glass);
    glass.add(new JLabel(pic));
    glass.setOpaque(false);

}
public void initialize_listeners(){
    glass_show.addActionListener(new ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent A) {
            glass.setVisible(true);
        }
    });

    hide_glass.addActionListener(new ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent A) {
            glass.setVisible(false);
        }
    });
}
 public static void main(String[] args) {
    circle mFrame = new circle();
    mFrame.initialize_listeners();
    mFrame.setVisible(true);
}

}

推荐答案

Java中存在动画GIF图像的错误.其他图像不会增加内存.

There is a bug in Java with animated GIF images. There is no memory increase with other images.

编辑;

下面的示例运行时没有内存泄漏;但您需要

Below example runs without memory leak; but you need Eclipse SWT library from Eclipse's site

import org.eclipse.swt.SWT;
import org.eclipse.swt.SWTException;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.graphics.ImageLoader;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Shell;

public class GIFExample {
    static Display display;
    static Shell shell;
    static GC shellGC;
    static Color shellBackground;
    static ImageLoader loader;
    static ImageData[] imageDataArray;
    static Thread animateThread;
    static Image image;
    static final boolean useGIFBackground = false;

    public static void main(String[] args) {
        display = new Display();
        shell = new Shell(display);
        shell.setSize(300, 300);
        shell.open();
        shellGC = new GC(shell);
        shellBackground = shell.getBackground();

        FileDialog dialog = new FileDialog(shell);
        dialog.setFilterExtensions(new String[] {"*.gif"});
        String fileName = dialog.open();
        if (fileName != null) {
            loader = new ImageLoader();
            try {
                imageDataArray = loader.load(fileName);
                if (imageDataArray.length > 1) {
                    animateThread = new Thread("Animation") {
                        @Override
                        public void run() {
                            /* Create an off-screen image to draw on, and fill it with the shell background. */
                            Image offScreenImage = new Image(display, loader.logicalScreenWidth, loader.logicalScreenHeight);
                            GC offScreenImageGC = new GC(offScreenImage);
                            offScreenImageGC.setBackground(shellBackground);
                            offScreenImageGC.fillRectangle(0, 0, loader.logicalScreenWidth, loader.logicalScreenHeight);

                            try {
                                /* Create the first image and draw it on the off-screen image. */
                                int imageDataIndex = 0;  
                                ImageData imageData = imageDataArray[imageDataIndex];
                                if (image != null && !image.isDisposed()) image.dispose();
                                image = new Image(display, imageData);
                                offScreenImageGC.drawImage(
                                        image,
                                        0,
                                        0,
                                        imageData.width,
                                        imageData.height,
                                        imageData.x,
                                        imageData.y,
                                        imageData.width,
                                        imageData.height);

                                /* Now loop through the images, creating and drawing each one
                                 * on the off-screen image before drawing it on the shell. */
                                int repeatCount = loader.repeatCount;
                                while (loader.repeatCount == 0 || repeatCount > 0) {
                                    switch (imageData.disposalMethod) {
                                    case SWT.DM_FILL_BACKGROUND:
                                        /* Fill with the background color before drawing. */
                                        Color bgColor = null;
                                        if (useGIFBackground && loader.backgroundPixel != -1) {
                                            bgColor = new Color(display, imageData.palette.getRGB(loader.backgroundPixel));
                                        }
                                        offScreenImageGC.setBackground(bgColor != null ? bgColor : shellBackground);
                                        offScreenImageGC.fillRectangle(imageData.x, imageData.y, imageData.width, imageData.height);
                                        if (bgColor != null) bgColor.dispose();
                                        break;
                                    case SWT.DM_FILL_PREVIOUS:
                                        /* Restore the previous image before drawing. */
                                        offScreenImageGC.drawImage(
                                                image,
                                                0,
                                                0,
                                                imageData.width,
                                                imageData.height,
                                                imageData.x,
                                                imageData.y,
                                                imageData.width,
                                                imageData.height);
                                        break;
                                    }

                                    imageDataIndex = (imageDataIndex + 1) % imageDataArray.length;
                                    imageData = imageDataArray[imageDataIndex];
                                    image.dispose();
                                    image = new Image(display, imageData);
                                    offScreenImageGC.drawImage(
                                            image,
                                            0,
                                            0,
                                            imageData.width,
                                            imageData.height,
                                            imageData.x,
                                            imageData.y,
                                            imageData.width,
                                            imageData.height);

                                    /* Draw the off-screen image to the shell. */
                                    shellGC.drawImage(offScreenImage, 0, 0);

                                    /* Sleep for the specified delay time (adding commonly-used slow-down fudge factors). */
                                    try {
                                        int ms = imageData.delayTime * 10;
                                        if (ms < 20) ms += 30;
                                        if (ms < 30) ms += 10;
                                        Thread.sleep(ms);
                                    } catch (InterruptedException e) {
                                    }

                                    /* If we have just drawn the last image, decrement the repeat count and start again. */
                                    if (imageDataIndex == imageDataArray.length - 1) repeatCount--;
                                }
                            } catch (SWTException ex) {
                                System.out.println("There was an error animating the GIF");
                            } finally {
                                if (offScreenImage != null && !offScreenImage.isDisposed()) offScreenImage.dispose();
                                if (offScreenImageGC != null && !offScreenImageGC.isDisposed()) offScreenImageGC.dispose();
                                if (image != null && !image.isDisposed()) image.dispose();
                            }
                        }
                    };
                    animateThread.setDaemon(true);
                    animateThread.start();
                }
            } catch (SWTException ex) {
                System.out.println("There was an error loading the GIF");
            }
        }

        while (!shell.isDisposed()) {
            if (!display.readAndDispatch()) display.sleep();
        }
        display.dispose();
    }
}

代码源

这篇关于为什么显示.GIF图像会不断增加内存?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆