0

我想请你帮忙解决以下问题

我正在使用 Java SE 开发软件并使用 url 中的 Java-Image Scaling 库:

https://code.google.com/p/java-image-scaling/

我正在调整一张大小为 47 MB​​ 的 6400x4800 的照片。

如果我在 Netbeans 中运行程序,调整大小就成功了。如果我运行 JAR 启动 DOS,也会成功调整大小。如果我在 Windows 中运行 JAR 文件资源管理器,则图像不会调整大小并且程序会永远停止。不产生任何异常

问题出在代码行中(当 .JAR 在 Windows 上运行时):

BufferedImage rescaled = resampleOp.filter(src, null);

我认为 Windows 锁定调整大小是因为图像大小太大或太重或需要很长时间才能运行此调整大小。

如果调整大小的图像较小,则不会发生 Windows 错误。我做了这个测试

如何在 Windows 中解决此问题?

有什么解决办法吗?

非常感谢

4

1 回答 1

0

似乎对我来说工作得很好;缩放 7680x4800 @ 23.3mb JPG 的图像。我遇到的唯一问题是,当从 Windows 资源管理器双击时,它会将图像放在C:\Windows\System32. 您可能会考虑使用输出文件JOptionPane的完整 ( )弹出 a ...CanonicalPath

import com.mortennobel.imagescaling.ProgressListener;
import com.mortennobel.imagescaling.ResampleOp;
import java.awt.EventQueue;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.concurrent.ExecutionException;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.ProgressMonitor;
import javax.swing.SwingWorker;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.EmptyBorder;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    protected JLabel message;

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                message = new JLabel("Rescampling, wait for it...");
                message.setHorizontalAlignment(JLabel.CENTER);
                message.setBorder(new EmptyBorder(10, 10, 10, 10));

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(message);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);

                ResampleWorker worker = new ResampleWorker();
                worker.execute();
            }
        });
    }

    public class ResampleWorker extends SwingWorker<String, String> {

        @Override
        protected String doInBackground() throws Exception {
            ProgressMonitor pm = new ProgressMonitor(null, "Scaling", "Please wait...", 0, 100);
            File source = new File("C:\\Users\\shane\\Downloads\\1713601.jpg");
            try {
                System.out.println("Reading...");
                publish("Reading source image...");
                BufferedImage img = ImageIO.read(source);

                int toWidth = img.getWidth() * 10;
                int toHeight = img.getHeight()* 10;

                System.out.println("From..." + (img.getWidth()) + "x" + (img.getHeight()));
                System.out.println("to..." + toWidth + "x" + toHeight);
                publish("Resample..." + toWidth + "x" + toHeight);
                ResampleOp op = new ResampleOp(toWidth, toHeight);
                Thread.yield();
                op.addProgressListener(new ProgressListener() {
                    public void notifyProgress(float fraction) {
                        int p = (int) (fraction * 100);
                        pm.setProgress(p);
//                        System.out.println(p);
                    }
                });
                BufferedImage scaled = op.filter(img, null);
                pm.close();
//                File dest = new File("scaled.jpg");
//                ImageIO.write(scaled, "jpg", dest);
//                JTextField field = new JTextField(dest.getCanonicalPath());
//                JOptionPane.showMessageDialog(null, field);
            } catch (IOException ex) {
                JOptionPane.showMessageDialog(null, "Failed to load - " + ex.getMessage());
            }
            publish("Done...");
            return null;
        }

        @Override
        protected void process(List<String> chunks) {
            message.setText(chunks.get(chunks.size() - 1));
            message.revalidate();
            message.repaint();
        }

        @Override
        protected void done() {
            try {
                get();
                JOptionPane.showMessageDialog(null, "All done");
            } catch (InterruptedException | ExecutionException ex) {
                ex.printStackTrace();
                JOptionPane.showMessageDialog(null, "Error " + ex.getMessage());
            }
            System.exit(0);
        }


    }

}

还使用 1920x1200 的图像进行了测试,缩放到 7680x4800。

于 2014-08-28T00:50:36.640 回答