2013-04-14 48 views
5

Sto provando a scrivere un metodo che cattura un'immagine e salva una miniatura 100 per 100 di quell'immagine. Tuttavia, quando salvi il file, viene fuori come un'immagine 0 byte illeggibile (con l'errore "Errore nell'interpretazione del file immagine JPEG (chiamata impropria alla libreria JPEG nello stato 200)") in ImageViewer di Ubuntu. Il mio codice è il seguente:Utilizzo di ImageIO.write() per creare un JPEG crea un file da 0 byte

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

Dove "nomefile" è una variabile globale per l'alloggiamento di classe questo metodo, che rappresenta il percorso per l'immagine originale. Il mio problema principale è che non vedo perché sto creando un'immagine a 0 byte.

+0

AFAIK è necessario chiudere il buffer IO per qualsiasi cosa venga effettivamente scritta. Questo è generalmente il modo in cui l'I/O funziona in Java, ma potrebbe essere sbagliato. – Zyerah

+2

Verificare di disporre dell'autorizzazione per scrivere su disco e di disporre di spazio su disco disponibile – Reimeus

+0

@Reimeus: ho il permesso di scrivere e ho spazio disponibile su disco; almeno credo di farlo perché sono in grado di creare con successo altri file (in particolare file .txt) e, a meno di non fraintendere il tuo significato di "spazio su disco", ne ho abbastanza. –

risposta

3

Quindi, il problema era questo. Sto lavorando in OpenJDK. OpenJDK non dispone di un codificatore JPEG, a quanto pare, così mentre il file era stato creato da

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

non era in realtà la creazione nulla per il file da salvare; da qui il file illeggibile 0 byte vuoto. Cambiando l'argomento ImageIO in "png" (e regolando la nuova estensione File(), appropriatamente) è stata creata correttamente l'immagine desiderata con il codice sopra.

0

Ho riscontrato lo stesso problema anche se la JVM aveva un codificatore JPG ed era causato dall'uso di un tipo di BufferImage non supportato al di sotto. Avevo usato BufferedImage.TYPE_USHORT_GRAY che evidentemente non è supportato e non ha dato messaggi di errore ma ha prodotto un file da 0 byte. Quando sono passato a BufferedImage.TYPE_BYTE_GRAY ha funzionato perfettamente.