2014-08-28 10 views
0

Я хотел бы попросить вашей помощи, чтобы решить следующие задачиОшибка при изменении размера изображения в Java

Я занимаюсь разработкой программного обеспечения с Java SE и использовать Java-Image Scaling библиотека, которая находится в URL:

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

Я изменю размер фотографии, которая будет для 6400x4800 с 47 МБ.

Если я запускаю программу в пределах Netbeans, изменение размера выполняется успешно. Если я запускаю JAR, начинается также изменение размера DOS. Если я запустил JAR File Explorer в Windows, изображение не будет изменено, и программа остановится на вечность. Не генерирует каких-либо исключений

Проблема заключается в строке кода (Когда .JAR работает на Windows):

BufferedImage пересчитывается = resampleOp.filter (ЦСИ, NULL);

Я думаю, что размер замка Windows изменяется, потому что размер изображения слишком велик или слишком тяжелый или требуется много времени для запуска этого изменения размера.

Если размер изображения был меньше, ошибка Windows не возникала. Я сделал этот тест

Как решить эту проблему в Windows?

Есть ли решение для этого?

Большое спасибо

+0

Рассмотрите возможность использования [runnable example] (https://stackoverflow.com/help/mcve), который демонстрирует вашу проблему. Это приведет к меньшему путанице и лучшим ответам. – MadProgrammer

ответ

0

Кажется, работает очень хорошо для меня; масштабирование изображения 7680x4800 @ 23.3mb JPG. Единственная проблема, с которой я столкнулся, заключалась в том, что при двойном щелчке из проводника Windows она помещала изображение в C:\Windows\System32. Вы могли бы рассмотреть popuping вверх JOptionPane с полной (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); 
     } 


    } 

} 

также протестирована с изображением 1920х1200, масштабирование до 7680x4800.

+0

изменяет размер большого изображения на мелкие работы в обычном режиме. , но изменить размер большого изображения на еще большую причину разрыва в программе, не возвращая тип ошибки. –

+0

А, хорошо, проверит ... – MadProgrammer

+0

выполните тест с разрешением 1600 x 1200 с разрешением на размер до 6400x4800, затем создайте .jar и запустите от исследователя. Я проверил это с вашим кодом и дал ту же ошибку, пожалуйста, проверьте. .. –