2010-04-30 15 views
8

Questo è il codice che ho, funziona davvero, non perfettamente ma lo fa, il problema è che le miniature ridimensionate non si incollano sul rettangolo bianco disegnato, rompendo le proporzioni delle immagini, ecco il codice, qualcuno potrebbe suggerirmi una soluzione per questo, per favore?Java: Rilevamento formato immagine, ridimensionamento (scala) e salvataggio come JPEG

Grazie

import java.awt.Color; 
import java.awt.Graphics2D; 
import java.awt.Image; 
import java.awt.RenderingHints; 
import java.awt.geom.Rectangle2D; 
import java.awt.image.BufferedImage; 
import java.io.BufferedInputStream; 
import java.io.ByteArrayInputStream; 
import java.io.ByteArrayOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 

import javax.imageio.ImageIO; 

import org.apache.commons.logging.Log; 
import org.apache.commons.logging.LogFactory; 

public class ImageScalerImageIoImpl implements ImageScaler { 

private static final String OUTPUT_FORMAT_ID = "jpeg"; 

// Re-scaling image 
public byte[] scaleImage(byte[] originalImage, int targetWidth, 
    int targetHeight) { 

    try { 
    InputStream imageStream = new BufferedInputStream(
    new ByteArrayInputStream(originalImage)); 
    Image image = (Image) ImageIO.read(imageStream); 

    int thumbWidth = targetWidth; 
    int thumbHeight = targetHeight; 

    // Make sure the aspect ratio is maintained, so the image is not skewed 
     double thumbRatio = (double)thumbWidth/(double)thumbHeight; 
     int imageWidth = image.getWidth(null); 
     int imageHeight = image.getHeight(null); 
     double imageRatio = (double)imageWidth/(double)imageHeight; 
     if (thumbRatio < imageRatio) { 
      thumbHeight = (int)(thumbWidth/imageRatio); 
     } else { 
      thumbWidth = (int)(thumbHeight * imageRatio); 
     } 

    // Draw the scaled image 
    BufferedImage thumbImage = new BufferedImage(thumbWidth, 
    thumbHeight, BufferedImage.TYPE_INT_RGB); 
    System.out.println("Thumb width Buffered: " + thumbWidth + " || Thumb height Buffered: " + thumbHeight); 

    Graphics2D graphics2D = thumbImage.createGraphics(); 
    // Use of BILNEAR filtering to enable smooth scaling 
    graphics2D.setRenderingHint(RenderingHints.KEY_INTERPOLATION, 
    RenderingHints.VALUE_INTERPOLATION_BILINEAR); 
    // graphics2D.drawImage(image, 0, 0, thumbWidth, thumbHeight, null); 

    // White Background 
    graphics2D.setPaint(Color.WHITE); 
    graphics2D.fill(new Rectangle2D.Double(0, 0, targetWidth, 
    targetHeight)); 
    graphics2D.fillRect(0, 0, targetWidth, targetHeight); 

    System.out.println("Target width: " + targetWidth + " || Target height: " + targetHeight); 

    // insert the resized thumbnail between X and Y of the image 
    graphics2D.drawImage(image, 0, 0, thumbWidth, thumbHeight, null); 

    System.out.println("Thumb width: " + thumbWidth + " || Thumb height: " + thumbHeight); 

    // Write the scaled image to the outputstream 
    ByteArrayOutputStream out = new ByteArrayOutputStream(); 
    ImageIO.write(thumbImage, OUTPUT_FORMAT_ID, out); 
    return out.toByteArray(); 

    } catch (IOException ioe) { 
    throw new ImageResizingException(ioe); 
    } 
} 

} 

risposta

9

Si può facilmente scalare l'immagine utilizzando Image s' getScaledInstance metodo:

BufferedImage img = ImageIO.read(new File("image.jpg")); 
int scaleX = (int) (img.getWidth() * 0.5); 
int scaleY = (int) (img.getHeight() * 0.5); 

Image newImg = img.getScaledInstance(scaleX, scaleY, Image.SCALE_SMOOTH); 

Una volta che hai ottenuto la tua scala Image è possibile 'convertire' nuovamente in a BufferedImage come descritto here.

Infine, utilizzare la classe ImageIO per scrivere il file BufferedImage in un file.

+0

Il ridimensionamento deve essere dinamico in base al contenitore Tela di destinazione. Ad ogni modo, ho risolto il problema con un buon refactoring e un paio di soluzioni logiche. Grazie comunque il collegamento – BoDiE2003

+0

non funziona. suggerimenti per la trasformazione Image to BufferedImage? – Karussell

+0

Quale link non funziona? Ho appena provato tutti loro e sembrano ok. – Adamski