2010-04-30 11 views
8

Este es el código que tengo, en realidad funciona, no perfectamente, pero lo hace, el problema es que las miniaturas redimensionadas no se pegan en el rectángulo dibujado blanco, rompiendo la relación de aspecto de las imágenes, aquí está el código, ¿podría alguien sugerirme una solución, por favor?Java: detección de formato de imagen, cambio de tamaño (escala) y guardar como JPEG

Gracias

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

} 

Respuesta

9

Puede escalar fácilmente su imagen utilizando Image 's getScaledInstance método:

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

vez que haya obtenido su escala Image puede 'convertir' de nuevo en a BufferedImage como se describe here.

Finalmente, use la clase ImageIO para escribir su BufferedImage en un archivo.

+0

La escala debe ser dinámica dependiendo del contenedor Canvas de destino. De todos modos, lo he resuelto yo mismo con una buena refactorización y un par de soluciones lógicas. Gracias de todos modos – BoDiE2003

+0

el enlace no funciona. sugerencias para la transformación de Imagen a Imagen Buffered? – Karussell

+0

¿Qué enlace no funciona? Los probé todos y parecen estar bien. – Adamski

Cuestiones relacionadas