Problema ao redimensionar imagens

5 respostas
T

Olá pessoal. Estou com problema para lidar com imagens. Estou criando uma aplicação WEB que
quando um usuário digita um determinado código em um campo, o sistema busca a imagem
correspondente é exibe na página.O problema é que estas imagens podem aparecer em dois
tamanhos, quando aparece no tamanho grande (original) não há problema,
mas quando aparece no formato pequeno a imagem perde a qualidade, obs( o problema não é dela
ficar deformada e sim baixa resolução). Estou definindo o tamanho da imagem fia <tag> por meio
do width e height. Se eu for criar uma imagem para cada caso vai me dar muito trabalho, pois
são muitas imagens. Alguém conhece alguma solução para este caso?

5 Respostas

M

Olá, talvez seja interessante você criar um código para redimensionar a imagem.

Vou te passar um até interessante:
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.MalformedURLException;

import javax.swing.ImageIcon;

import com.sun.image.codec.jpeg.ImageFormatException;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGEncodeParam;
import com.sun.image.codec.jpeg.JPEGImageEncoder;

public class Miniatura {
	private String imagesDir = &quot;c:/temp/&quot;;

	public static void main(String[] args) {
		new Miniatura().iniciar();
	}

	public void iniciar() {
		int width = 200; // Lagura da miniatura
		int height = 200; // Altuta da miniatura
		int quality = 80; // Qualidade da imagem [0~100]

		File file = new File(imagesDir + &quot;DSC00001.JPG&quot;);

		try {
			Image image = new ImageIcon(file.toURL()).getImage();
			redimensionar(image, width, height, quality, file.getName());
			System.out.println(&quot;A imagem &quot; + file.getName()
					+ &quot; foi redimensionada com sucesso&quot;);

		} catch (MalformedURLException e) {
			System.out.println(&quot;MalformedURLException &quot; + e.getMessage());
		}

	}

	// Método para redimensionar imagens (criar thubmnails)
	private void redimensionar(Image image, int width, int height, int quality,
			String nomeImagem) {

		// Calculos necessários para manter as propoçoes da imagem, conhecido
		// como &quot;aspect ratio&quot;
		double thumbRatio = (double) width / (double) height;
		int imageWidth = image.getWidth(null);
		int imageHeight = image.getHeight(null);

		double imageRatio = (double) imageWidth / (double) imageHeight;

		if (thumbRatio &lt; imageRatio) {
			height = (int) (width / imageRatio);
		} else {
			width = (int) (height * imageRatio);
		}
		// Fim do cálculo

		BufferedImage thumbImage = new BufferedImage(width, height,
				BufferedImage.TYPE_INT_RGB);

		Graphics2D graphics2D = thumbImage.createGraphics();

		graphics2D.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
				RenderingHints.VALUE_INTERPOLATION_BILINEAR);

		graphics2D.drawImage(image, 0, 0, width, height, null);

		BufferedOutputStream out;

		try {

			out = new BufferedOutputStream(new FileOutputStream(imagesDir
					+ nomeImagem));
			JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
			JPEGEncodeParam param = encoder
					.getDefaultJPEGEncodeParam(thumbImage);
			quality = Math.max(0, Math.min(quality, 100));
			param.setQuality((float) quality / 100.0f, false);
			encoder.setJPEGEncodeParam(param);
			encoder.encode(thumbImage);
			out.close();

		} catch (FileNotFoundException e) {
			System.out.println(&quot;FileNotFoundException &quot; + e.getMessage());
		} catch (ImageFormatException e) {
			System.out.println(&quot;ImageFormatException &quot; + e.getMessage());
		} catch (IOException e) {
			System.out.println(&quot;IOException &quot; + e.getMessage());
		}
	}

}
P

Marco,

Cara funcionou perfeitamente! Salvou minha vida! Valew.

abraços,

alandiniz

Desculpa meio q reviver o tópico… mais pode ajudar alguém…

usar o pacote com.sun.image.codec.jpeg pode dar problemas, e aconteceu comigo ^^…
aki: http://stackoverflow.com/questions/1906673/import-com-sun-image-codec-jpeg
e aki: http://www.oracle.com/technetwork/java/faq-sun-packages-142232.html

D

Olá pessoas, sou novo no fórum e reparei uma coisa: este código é para desktop, bom eu procuro uma solução utilizando JAI ou não, só que para web, com servlets ou até JSP mesmo.

Alguém sabe como?

  • PS: já tentei capturar as dimensões no meu JSP com .getWidth() mas não é reconhecido este método . =/

att

D

Pow muito bom ;]

Criado 15 de setembro de 2008
Ultima resposta 25 de jun. de 2009
Respostas 5
Participantes 5