2013-04-14 2 views
5

Я пытаюсь написать метод, который принимает изображение, и сохраняет эскиз 100 на 100 изображений. Однако, когда я сохраняю файл, он выводится как нечитаемое 0-байтное изображение (с ошибкой «Ошибка интерпретации файла изображения JPEG (неправильный вызов в библиотеке JPEG в состоянии 200)») в ImageViewer Ubuntu. Мой код выглядит следующим образом:Использование ImageIO.write() для создания JPEG создает 0-байтовый файл

public boolean scale(){ 

    String file = filename.substring(filename.lastIndexOf(File.separator)+1); 
    File out = new File("data"+File.separator+"thumbnails"+File.separator+file); 

    if(out.exists()) return false; 

    BufferedImage bi; 
    try{ 
     bi = ImageIO.read(new File(filename)); 
    } 
    catch(IOException e){ 
     return false; 
    } 

    Dimension imgSize = new Dimension(bi.getWidth(), bi.getHeight()); 
    Dimension bounds = new Dimension(100, 100); 
    int newHeight = imgSize.height; 
    int newWidth = imgSize.width; 

    if(imgSize.width > bounds.width){ 
     newWidth = bounds.width; 
     newHeight = (newWidth*imgSize.height)/imgSize.width; 
    } 

    if(imgSize.height > bounds.width){ 
     newHeight = bounds.height; 
     newWidth = (newHeight*imgSize.width)/imgSize.height; 
    } 

    Image img = bi.getScaledInstance(newWidth, newHeight, BufferedImage.SCALE_SMOOTH); 
    BufferedImage thumb = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_4BYTE_ABGR); 
    Graphics2D g2d = thumb.createGraphics(); 
    g2d.drawImage(img, 0, 0, null); 
    g2d.dispose(); 

    try{ 
     ImageIO.write(thumb, "jpg", out); 
    } 
    catch(IOException e){ 
     return false; 
    } 

    return true; 
} 

Где «имя файл» является глобальным переменным для корпуса класса этого метода, представляющий путь к исходному изображению. Моя основная проблема заключается в том, что я не понимаю, почему я создаю 0-байтовый образ.

+0

AFAIK вам нужно закрыть буфер ввода-вывода для чего-либо, чтобы на самом деле было написано. Как правило, как работает IO на Java, может быть и неправильным. – Zyerah

+2

Убедитесь, что у вас есть разрешение на запись на диск и у вас есть свободное место на диске – Reimeus

+0

@Reimeus - У меня есть разрешение на запись, и у меня есть свободное место на диске; по крайней мере, я считаю, что я делаю так, как могу успешно создавать другие файлы (в частности, файлы .txt), и, если я не понимаю ваш смысл «дискового пространства», у меня много. –

ответ

3

Итак, проблема была в этом. Я работаю в OpenJDK. OpenJDK не имеет кодер JPEG, видимо, поэтому в то время как файл был быть создан

ImageIO.write(thumb, "jpg", out); 

это не было на самом деле создать что-нибудь для сохраняемого файла; следовательно, пустой 0-байтовый нечитаемый файл. Изменение аргумента ImageIO на «png» (и соответственно соответствующее расширение для File()) успешно создало желаемое изображение с указанным выше кодом.

0

У меня возникла такая же проблема, даже если JVM имеет кодировщик JPG, и это было вызвано использованием неподдерживаемого типа BufferImage под ним. Я использовал BufferedImage.TYPE_USHORT_GRAY, который, очевидно, не поддерживается и не выдавал сообщений об ошибках, а создавал файл с 0 байтами. Когда я переключился на BufferedImage.TYPE_BYTE_GRAY, он работал отлично.