有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Apache POI pptx图像处理时间过长

我有代码将pptx幻灯片转换为图像,并在swing panel中显示图像

当我在eclipse中运行代码时,显示面板需要10秒,而同样的代码通过jar运行时,打开面板需要一分钟以上

只有当用户第一次打开它时才会发生这种情况,之后加载速度会更快

如有任何帮助,我们将不胜感激

这里我包括了代码

 // currentPage - Slide number to display
 // source - pptx file path
 public void Display(int currentPage, String source) {
    try {

        FileInputStream is = new FileInputStream(source);
        XMLSlideShow ppt = new XMLSlideShow(is);
        is.close();

        double zoom = 1; // magnify it by 2
        AffineTransform at = new AffineTransform();
        at.setToScale(zoom, zoom);

        Dimension pgsize = ppt.getPageSize();

        XSLFSlide[] slides = ppt.getSlides();
        all = slides.length;
        lblPage.setText(currentPage + " / " + all);

        current = currentPage;

        BufferedImage img = new BufferedImage(pgsize.width, pgsize.height, BufferedImage.TYPE_INT_RGB);

        Graphics2D graphics = img.createGraphics();
        graphics.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY);
        graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        graphics.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
        graphics.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
        graphics.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);
        graphics.transform(at);

        graphics.setColor(Color.white);
        graphics.clearRect(0, 0, pgsize.width, pgsize.height);
        graphics.fill(new Rectangle2D.Float(0, 0, pgsize.width, pgsize.height));

        System.out.println("Before draw: " + new Date());

        slides[currentPage - 1].draw(graphics);

        System.out.println("After draw: " + new Date());

        // save the output
        Image newImg = img.getScaledInstance(lblPresentasi.getWidth(), lblPresentasi.getHeight(), Image.SCALE_SMOOTH);
        final ImageIcon icon = new ImageIcon(newImg);
        lblPresentasi.setIcon(icon);
        lblPresentasi.addComponentListener(new ComponentAdapter() {
            @Override
            public void componentResized(ComponentEvent e) {
                JLabel label = (JLabel) e.getComponent();
                Dimension size = label.getSize();
                Image resized = icon.getImage().getScaledInstance(size.width-10, size.height-10, Image.SCALE_FAST);
                label.setIcon(new ImageIcon(resized));
            }
        });
        graphics.dispose();
        newImg.flush();
    } catch (Exception e) {
        e.printStackTrace();
    }
}// end of method Display()

共 (1) 个答案

  1. # 1 楼答案

    这个延迟是由一个Jar自定义类加载器引起的。第一次,加载依赖项库和加载it类需要更多的时间

    因此,我删除了一个jar,并使用JarSplice加载依赖库类,效果非常好