2014-08-28 83 views
0

图像时,我想问一下您的帮助与Java SE解决以下问题误差调整在Java

我正在开发软件,并使用Java的图像缩放库,在网址:

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

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

如果我在Netbeans内运行程序,调整大小是成功执行的。 如果我运行JAR开始DOS调整成功也会发生。 如果我在Windows中运行JAR文件资源管理器,则图像不会调整大小,程序将永久停止。不产生任何异常

的问题是在代码行(当.JAR运行在Windows上):

BufferedImage的重新调整= resampleOp.filter(SRC,NULL);

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

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

如何解决Windows中的这个问题?

有没有解决方案?

非常感谢

+0

考虑提供一个[可运行示例](https://stackoverflow.com/help/mcve),它演示了您的问题。这将导致更少的混淆和更好的响应 – MadProgrammer 2014-08-28 00:32:24

回答

0

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

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


    } 

} 

具有1920×1200的图像还测试,扩展到7680x4800。

+0

通常将较大的图像调整为较小的作品。 ,但将大图像调整为更大的原因而导致程序中断而不返回某种类型的错误。 – 2014-08-28 01:08:53

+0

嗯,好吧,将测试... – MadProgrammer 2014-08-28 01:09:17

+0

做一个测试1600 x 1200图像调整大小为6400x4800,然后创建一个.jar并从探索运行。 我测试了这个代码并给出了相同的错误,请测试。 .. – 2014-08-28 01:26:44