Manipulção de imagem

Olá à todos!

Como faço para limitar o tamanho de uma imagem na hora que o usuário for buscar pelo filechooser?
Por exemplo: Só é permitido imagens de 250X250, nem menos nem mais.

Obrigado a todos. :thumbup:

Nunca vi implementação parecida… Acho que isso pode ser complexo… Gostaria de saber e ajudar.

Utilize os filtros do java como aqui: http://java.sun.com/docs/books/tutorial/uiswing/components/filechooser.html

E no método accept, abra a imagem, busque o tamanho dela (Image.getWidth() e image.getHeight()) e aceite se < 250X250.

Acabei fazendo diferente por achar isto meio complicado e deu certo…

como eu criava um ImageIcon dessa imagem então eu media o tamanho do ImageIcon e se fosse o tamanho válido carregava a imagem no sistema se não dava um alerta e abria o JFileChooser de novo.

Usei a seguinte instrução para pegar as medidas:

seuImageIcon.getIconWidth();

e

seuImageIcon.getIconHeight();

Valeu gente! :thumbup: :thumbup: :thumbup:

Cara…
com um FileFilter voce faria isso e nem mostraria pro usuario as imagens maiores.

import java.io.File;
import javax.swing.*;
import javax.swing.filechooser.*;

/* ImageFilter.java is used by FileChooserDemo2.java. */
public class ImageFilter extends FileFilter {

    public boolean accept(File f) {
        if (f.isDirectory()) {
            return true;
        }

        String extension = Utils.getExtension(f);
        if (extension != null) {
            if (extension.equals(Utils.tiff) ||
                extension.equals(Utils.tif) ||
                extension.equals(Utils.gif) ||
                extension.equals(Utils.jpeg) ||
                extension.equals(Utils.jpg) ||
                extension.equals(Utils.png) || extension.equals(Utils.bmp)) {
                    BufferedImage img = ImageIO.read(f);
                    return (img.getWidth() <= 250) && (img.getHeight() <= 250);
            } else {
                return false;
            }
        }

        return false;
    }

    //The description of this filter
    public String getDescription() {
        return "Just Images";
    }
}

public class Utils {

    public final static String jpeg = "jpeg";
    public final static String jpg = "jpg";
    public final static String gif = "gif";
    public final static String tiff = "tiff";
    public final static String tif = "tif";
    public final static String png = "png";
    public final static String bmp = "bmp";

    /*
     * Get the extension of a file.
     */  
    public static String getExtension(File f) {
        String ext = null;
        String s = f.getName();
        int i = s.lastIndexOf('.');

        if (i > 0 &&  i < s.length() - 1) {
            ext = s.substring(i+1).toLowerCase();
        }
        return ext;
    }
}

Fai no FileChosser voce passa uma instancia desse FileFilter para filtrar.

Eu tirei essas classes do tutorial da Sun:

http://java.sun.com/docs/books/tutorial/uiswing/components/filechooser.html

e adaptei.

Mas voce ainda tem a opção de filtrar apenas imagens e depois redimensiona-las.

Gostei da idéia de apenas filtrar e depois redimensionar, como se faz isso?
Mark_Ameba, não consegui entender o seu exemplo.

BufferedImage src = //A imagem selecionada voce pode pegar por exemplo ImageIO.read(arquivoSelecionado);
BufferedImage dest = new BufferedImage(250,250,
BufferedImage.TYPE_INT_RGB);
Graphics2D g = dest.createGraphics();
AffineTransform at = AffineTransform.getScaleInstance(
(double)250/src.getWidth(),
(double)250/src.getHeight());
g.drawRenderedImage(src,at);
//dest agora tem 250x250 pixels e com a imagem redimensionada.

E sobre o exemplo… é para mostrar no FileChooser apenas imagens que tenham aquelas extensões e que sejam menor ou iguais a 250x250.

Se no seu caso voce quer limitar 250x250 por causa do peso da imagem e não por algum espaço que ela ocupe… voce podia fazer um calculo para ver se ela tem a mesma quantidade de pixes mesmo que em outro formato… seria interessante pro usuario inves de colocar uma imagem de 250x250 pixels, uma de 100x625 que tem a mesma quantidade de pixels. ^^

Valeu Mark_Ameba!!! Caiu como uma luva! :thumbup: :thumbup: :thumbup: :thumbup: :thumbup: