2011-11-27 12 views
5

Ho uno snippet di codice che sto usando per ridimensionare un'immagine a una dimensione della tenda (voglio cambiare la risoluzione a qualcosa come 200 dpi). Fondamentalmente il motivo per cui ho bisogno è perché voglio visualizzare l'immagine che l'utente ha scelto (in qualche modo grande) e quindi se l'utente approva voglio visualizzare la stessa immagine in un posto diverso ma usando una risoluzione più piccola. Sfortunatamente, se gli do un'immagine grande, non appare nulla sullo schermo. Inoltre, se cambioRidimensionamento di un'immagine in oscillazione

imageLabel.setIcon(newIcon); 

a

imageLabel.setIcon(icon); 

ho l'immagine da visualizzare, ma non nella risoluzione corretta è così che so che ho un problema all'interno di questa snipper di codice e non da qualche altra parte .

Image img = icon.getImage(); 

BufferedImage(img.getWidth(null), img.getHeight(null), BufferedImage.TYPE_INT_ARGB); 
BufferedImage bi = new BufferedImage(img.getWidth(null), img.getHeight(null), BufferedImage.TYPE_INT_ARGB); 
Graphics g = bi.createGraphics(); 
boolean myBool = g.drawImage(img, 0, 0, 100, 100, null); 
System.out.println(myBool); 
ImageIcon newIcon = new ImageIcon(bi); 
imageLabel.setIcon(newIcon); 
submitText.setText(currentImagePath); 
imageThirdPanel.add(imageLabel); 
+0

1) Hai avuto una domanda? 2) Si noti che tutto fino a 'ImageIcon newIcon = new ImageIcon (bi);' è AWT, non Swing. 3) È 'Swing', non 'swing' 4) Per una migliore help sooner, post an [SSCCE] (http://sscce.org/). –

+0

Ok. Non visualizzo l'intero codice perché è troppo lungo. Inoltre, non sono sicuro del perché tu dici che è Swing e non swing (questo è tutto quando sono arrivato dal tag auto, non ho visto come è colpa mia). Penso che sia SSCCE. Come ho detto, il resto del codice funziona, sono sicuro che c'è un problema in questo frammento di codice. Probabilmente quando disegno l'immagine, ma non sono sicuro di cosa. –

+0

* "Penso che sia SSCCE." * Pensi di sbagliare. Si prega di leggere il documento. –

risposta

6

Ecco la mia soluzione:

private BufferedImage resizeImage(BufferedImage originalImage, int width, int height, int type) throws IOException { 
     BufferedImage resizedImage = new BufferedImage(width, height, type); 
     Graphics2D g = resizedImage.createGraphics(); 
     g.drawImage(originalImage, 0, 0, width, height, null); 
     g.dispose(); 
     return resizedImage; 
    } 
1

provare questo codice per ridimensionare un'immagine:

public static Image scaleImage(Image original, int newWidth, int newHeight) { 
    //do nothing if new and old resolutions are same 
    if (original.getWidth() == newWidth && original.getHeight() == newHeight) { 
     return original; 
    } 

    int[] rawInput = new int[original.getHeight() * original.getWidth()]; 
    original.getRGB(rawInput, 0, original.getWidth(), 0, 0, original.getWidth(), original.getHeight()); 
    int[] rawOutput = new int[newWidth * newHeight]; 
    // YD compensates for the x loop by subtracting the width back out 
    int YD = (original.getHeight()/newHeight) * original.getWidth() - original.getWidth(); 
    int YR = original.getHeight() % newHeight; 
    int XD = original.getWidth()/newWidth; 
    int XR = original.getWidth() % newWidth; 
    int outOffset = 0; 
    int inOffset = 0; 
    for (int y = newHeight, YE = 0; y > 0; y--) { 
     for (int x = newWidth, XE = 0; x > 0; x--) { 
      rawOutput[outOffset++] = rawInput[inOffset]; 
      inOffset += XD; 
      XE += XR; 
      if (XE >= newWidth) { 
       XE -= newWidth; 
       inOffset++; 
      } 
     } 
     inOffset += YD; 
     YE += YR; 
     if (YE >= newHeight) { 
      YE -= newHeight; 
      inOffset += original.getWidth(); 
     } 
    } 
    return Image.createRGBImage(rawOutput, newWidth, newHeight, false); 
} 
9

Non avete davvero bisogno di preoccuparsi per i dettagli di immagini di scala. La classe Image ha già un metodo getScaledInstance(int width, int height, int hints) progettato per questo scopo. documentazione Java dice:

Crea una versione ridotta di questa immagine. Viene restituito un nuovo oggetto Immagine che renderà l'immagine alla larghezza e all'altezza specificata per default di . Il nuovo oggetto Image può essere caricato in modo asincrono anche se l'immagine originale di origine è già stata caricata completamente. Se la larghezza o l'altezza è un numero negativo, viene sostituito da un valore per mantenere le proporzioni delle dimensioni dell'immagine originale.

E si può usare in questo modo:

// Scale Down the original image fast 
Image scaledImage = imageToScale.getScaledInstance(newWidth, newHighth, Image.SCALE_FAST); 
// Repaint this component 
repaint(); 

Controllare this per un esempio completo.

+0

Se è necessaria una scala proporzionale, passare '-1' come argomento per la misura che dovrebbe seguire l'altra. Ad esempio, se vuoi ridimensionare in base alla larghezza, chiameresti qualcosa come 'anImage.getScaledInstance (150, -1, java.awt.Image.SCALE_FAST) ' –

Problemi correlati