2013-04-14 19 views
5

Próbuję napisać metodę, która pobiera obraz i zapisuje miniaturę 100 na 100 tego obrazu. Jednak, po zapisaniu pliku, wychodzi jako nieczytelny obraz bajtowy (z błędem "Błąd interpretacji pliku obrazu JPEG (nieprawidłowe połączenie z biblioteką JPEG w stanie 200)") w ImageViewer Ubuntu. Mój kod jest następujący:Użycie ImageIO.write() do utworzenia pliku JPEG tworzy plik 0-bajtowy

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

Gdzie "filename" jest zmienną globalną dla klasy, w której znajduje się ta metoda, reprezentującą ścieżkę do oryginalnego obrazu. Moim głównym problemem jest to, że nie widzę powodu, dla którego tworzę obraz o wielkości 0 bajtów.

+0

AFAIK, musisz zamknąć bufor IO, aby cokolwiek zostało faktycznie zapisane. Tak ogólnie działa IO w Javie - może być jednak źle. – Zyerah

+2

Sprawdź, czy masz uprawnienia do zapisu na dysk i czy masz wolne miejsce na dysku. – Reimeus

+0

@Reimeus - Mam pozwolenie na pisanie i mam wolne miejsce na dysku; przynajmniej wierzę, że robię, ponieważ mogę skutecznie tworzyć inne pliki (w szczególności pliki .txt) i jeśli nie rozumiem znaczenia "miejsca na dysku", mam mnóstwo. –

Odpowiedz

3

Problem był taki. Pracuję w OpenJDK. OpenJDK nie posiada koder JPEG, widocznie, więc gdy plik był tworzony przez

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

nie było faktycznie stworzenie czegoś dla pliku, aby zapisać; stąd pusty nieczytelny plik 0 bajtów. Zmiana argumentu ImageIO na "png" (i odpowiednie dopasowanie nowego rozszerzenia pliku() odpowiednio stworzyło pożądany obraz z powyższym kodem.

0

Doświadczyłem tego samego problemu, mimo że JVM posiadało koder JPG i zostało spowodowane używaniem nieobsługiwanego typu BufferImage poniżej. Użyłem BufferedImage.TYPE_USHORT_GRAY, który najwyraźniej nie jest obsługiwany i nie przekazał komunikatów o błędach, ale wygenerował plik o wielkości 0 bajtów. Po przełączeniu na BufferedImage.TYPE_BYTE_GRAY zadziałało idealnie.

Powiązane problemy