Pregunta

Tengo que escalar una imagen con Java JAI. En el momento ahora, yo uso el código siguiente:

private static RenderedOp scale(RenderedOp image, float scale) {
    ParameterBlock scaleParams = new ParameterBlock();
    scaleParams.addSource(image);
    scaleParams.add(scale).add(scale).add(0.0f).add(0.0f);
    scaleParams.add(Interpolation.getInstance(Interpolation.INTERP_BICUBIC_2));

    // Quality related hints when scaling the image
    RenderingHints scalingHints = new RenderingHints(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
    scalingHints.put(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY);
    scalingHints.put(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    scalingHints.put(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY);
    scalingHints.put(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_ENABLE);
    scalingHints.put(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
    scalingHints.put(JAI.KEY_BORDER_EXTENDER, BorderExtender.createInstance(BorderExtender.BORDER_COPY));

    return JAI.create("scale", scaleParams, scalingHints);
}

Por desgracia, esto conduce a resultados muy malos, sobre todo porque a menudo tienen que imágenes en escala con un factor de escala de menos de 0,5 ...

Cualquier consejo?

¿Fue útil?

Solución

Creo que te está tratando de escalar una imagen más grande a un tamaño miniatura o algún igualmente grande diferencia del original a la imagen escalada?

Si-es así, este tema fue en realidad la dirección de Chris Campbell de la parte posterior Java2D en 2007 (no estoy esperando que sabía esto, simplemente señalando que se trata de una pregunta común) debido a que la nueva escala se acerca Java2D (RenderingHints.VALUE_INTERPOLATION_ * ) no proporcionó un equivalente a la entonces desuso Image.getScaledInstance (SCALE_AREA_AVERAGING o SCALE_SMOOTH ) enfoque .

Como resultado, la SCALE_AREA_AVERAGING o SCALE_SMOOTH se acerca a la antigua Java 1.1 Image.getScaledInstance enfoque era una operación bastante costosa, de múltiples pasos que estaba haciendo un montón de trabajo en segundo plano para generar esa imagen de aspecto agradable.

Chris señaló que el nuevo y forma "correcta", utilizando Java2D, para conseguir este mismo resultado es que se alcanza un proceso incremental de escalar la imagen en la mitad una y otra hasta que el tamaño de la imagen deseada, preferiblemente usando una de mayor escala de calidad como RenderHints.VALUE_INTERPOLATION_BICUBIC o BILINEAR.

El resultado sale casi idéntico al enfoque Image.getScaledInstance original que la gente quiere.

En realidad, fui a la caza de esta respuesta hace unos meses mientras se escribe un servicio de imágenes de alojamiento y se sorprendió de lo complicado la simple pregunta de "¿Cómo puedo hacer un buen aspecto miniatura en Java?" se convirtió.

I finalmente crear una pequeña biblioteca de Java (Apache 2, de código abierto) que implementa 3 enfoques diferentes para el escalado de imágenes en Java utilizando las "mejores prácticas", incluyendo el enfoque incremental que Chris sugirió.

La biblioteca se llama imgscalr . Usted puede descargar y utilizar lo más simple:

BufferedImage thumbnail = Scalr.resize(srcImage, 150);

Hay más opciones para configurar y usar (por ejemplo, la calidad o la velocidad de la escala), pero fuera de la caja existen incumplimientos inteligentes para todo para hacer un aspecto agradable imagen escalada para usted para que usted no tiene que preocuparse de más si no quiere. La biblioteca también hace un gran esfuerzo para disponer de ellos ya evitar cualquier asignación de objeto que no es absolutamente necesario y botar casos BufferedImage de inmediato si no es necesario - se pretende ser un código como parte de una aplicación de servidor de larga duración por lo que fue crítico.

He hecho algunos lanzamientos de la biblioteca ya, y si lo que queremos es arrancar las "cosas buenas" y hacer algo con usted mismo, vaya para él. todo lo que está en GitHub y nada de esto es alto secreto, sólo un intento de hacer la vida más fácil.

Espero que ayude.

Otros consejos

he obtenido buenos resultados con Thumbnailator . No sé lo que se supone JAI.KEY_BORDER_EXTENDER hacer, pero supongo que el resto de la funcionalidad (antialiasing, tramado, etc.) es compatible. Lo utilicé para generar imágenes en miniatura en escala de grises de bastante grandes imágenes en blanco y negro

Si tiene suerte y tiene sólo imágenes negras y blancas, a continuación, se puede utilizar muy rápido y el funcionamiento de buena calidad: SubsampleBinaryToGray

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top