2011-06-17 22 views
10

Necesito reducir el tamaño de la imagen (no el ancho y el alto) utilizando el programa Java. ¿Hay alguna buena API disponible para esto?disminuir la resolución de la imagen en java

Necesito reducir el tamaño de 1 MB a aproximadamente 50 kb - 100 kb. Por supuesto, la resolución disminuirá, pero eso no importa.

+2

Mucho mejor que la pregunta que se trataba de aumentar la resolución ... –

+0

¡Problema resuelto! revisa mi respuesta. –

Respuesta

6

Este es el código de trabajo

public class ImageCompressor { 
    public void compress() throws IOException { 
     File infile = new File("Y:\\img\\star.jpg"); 
     File outfile = new File("Y:\\img\\star_compressed.jpg"); 

     BufferedInputStream bis = new BufferedInputStream(new FileInputStream(
       infile)); 
     BufferedOutputStream bos = new BufferedOutputStream(
       new FileOutputStream(outfile)); 

     SeekableStream s = SeekableStream.wrapInputStream(bis, true); 

     RenderedOp image = JAI.create("stream", s); 
     ((OpImage) image.getRendering()).setTileCache(null); 

     RenderingHints qualityHints = new RenderingHints(
       RenderingHints.KEY_RENDERING, 
       RenderingHints.VALUE_RENDER_QUALITY); 

     RenderedOp resizedImage = JAI.create("SubsampleAverage", image, 0.9, 
       0.9, qualityHints); 

     JAI.create("encode", resizedImage, bos, "JPEG", null); 

    } 

    public static void main(String[] args) throws IOException { 

     new ImageCompressor().compress(); 
    } 
} 

Este código es gran trabajo para mí. si necesita cambiar el tamaño de la imagen, puede cambiar la escala xey de aquí JAI.create("SubsampleAverage", image, xscale,yscale, qualityHints);

+0

Gran respuesta Joven. Pero, ¿puedo aumentar el nivel de dpi de esta imagen? ¿Hay alguna forma de hacerlo? – Buntylm

+0

@BuntyMadan ver esto: http://stackoverflow.com/a/14050844/235710 –

9

De acuerdo con esta publicación de blog: http://i-proving.com/2006/07/06/java-advanced-imaging/ puede usar el Java Advanced Imaging Library para hacer lo que quiera. El siguiente código de ejemplo debería proporcionarle un buen punto de partida. Esto cambiará el tamaño de la imagen, tanto en altura como en ancho, además de la calidad de la imagen. Una vez que su imagen tiene el tamaño de archivo deseado, puede escalarla nuevamente a su altura y ancho de píxel deseados cuando muestre la imagen.

// read in the original image from an input stream 
SeekableStream s = SeekableStream.wrapInputStream(
    inputStream, true); 
RenderedOp image = JAI.create("stream", s); 
((OpImage)image.getRendering()).setTileCache(null); 

// now resize the image 

float scale = newWidth/image.getWidth(); 

RenderedOp resizedImage = JAI.create("SubsampleAverage", 
    image, scale, scale, qualityHints); 


// lastly, write the newly-resized image to an 
// output stream, in a specific encoding 

JAI.create("encode", resizedImage, outputStream, "PNG", null); 
0

Si su tipo de imagen es compatible con una implementación de ImageWriteParam, puede ajustar la calidad como se muestra en este example. Otros métodos ImageWriteParam, como getBitRate(), pueden permitirle optimizar el resultado.

+0

Probé ese ejemplo y no está funcionando. está creando un tamaño de imagen aún mayor cuando paso cualquier valor flotante excepto 1.0f. y cuando paso 1.0f está creando un archivo de bajo tamaño pero la calidad es demasiado baja o puedo decir que la imagen simplemente se pierde. –

+0

Puede consultar las descripciones y valores de calidad disponibles; el significado varía según el formato. Por cierto, ¿qué formato estás usando? – trashgod

Cuestiones relacionadas