[Resolvido] Redimensionar .bmp

4 respostas
P
Tenho este código que peguei por aqui,
public void redimencionarImagem(Image image, int width, int height, int quality, String nomeImagem) {
        double thumbRatio = (double) width / (double) height;
        int imageWidth = image.getWidth(null);
        int imageHeight = image.getHeight(null);


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

        if (thumbRatio < 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.setBackground(java.awt.Color.white);
        graphics2D.drawImage(image, 0, 0, width, height, null);

       BufferedOutputStream out;

        try {
            out = new BufferedOutputStream(new FileOutputStream("C:\\" + 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("FileNotFoundException " + e.getMessage());
        } catch (ImageFormatException e) {
            System.out.println("ImageFormatException " + e.getMessage());
        } catch (IOException e) {
            System.out.println("IOException " + e.getMessage());
        }

    }

mas estou com um problema, necessito redimensionar arquivos de extensão .bmp, e quando é redimensionado e criado o arquivo, o arquivo está todo preto, quando faço o mesmo para arquivos .jpg, funciona normalmente, apenas para .bmp que não estou conseguindo fazer funcionar.

alguém tem alguma idéia que possa me ajudar?

Obrigado!

4 Respostas

ViniGodoy

Troque todo esse trecho, pelo seu respectivo usando ImageIO:

out = new BufferedOutputStream(new FileOutputStream("C:\\" + 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();

Para:

ImageIO.write(thumbImage, "bmp", new File("C:\\" + nomeImagem));

Como você pode ver no código original, ele usa um JPEG encoder, que realmente não serve para bmp.

Outra coisa, aproveite e corrija o nome do método. Redimensionar com “c” é ingnoranssa.

P

hehe obrigado por estar atento ao nome do método,

eu mudei o código e dexei de usar este método, e fui para:

jLFoto.setIcon(new ImageIcon(ImageIO.read(new File(nomeFoto)).getScaledInstance(500, 500, Image.SCALE_DEFAULT)));

funcionou como eu gostaria, agora, com a experiência, sua e dos demais colegas, deste modo que fiz, posso usar sem problemas?
Pois, não crio nenhum outro arquivo a mais no servidor, uso direto o arquivo que passo e achei mais simples.

É certo usar este scaledInstance?

Obrigado.

P

bom, como testes que estou fazendo, o modo como estou usando, não gostei pois não redimensiona com precisão, digo sem proporção de tamanho.

e continuo tendo o mesmo problema com o

ImageIO.write(thumbImage, "bmp", new File("C:\\" + nomeImagem));
P

Como não estava tendo sucesso nas minhas tentativas, juntei os 2 modos que vi para redimensionar com proporção e para qualquer arquivo, sem escrever um novo arquivo…

File nomeFile = new File(nome);
jLFoto.setIcon(new ImageIcon(redimensionar(nomeFile, 300, 300)));

public Image redimensionar(File arquivo, int width, int height) throws Exception {

        try {
            Image image = new ImageIcon(arquivo.toURI().toURL()).getImage();

            double thumbRatio = (double) width / (double) height;
            int imageWidth = image.getWidth(null);
            int imageHeight = image.getHeight(null);

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

            if (thumbRatio < imageRatio) {
                height = (int) (width / imageRatio);
            } else {
                width = (int) (height * imageRatio);
            }

            return ImageIO.read(arquivo).getScaledInstance(width, height, Image.SCALE_DEFAULT);

        } catch (Exception e) {
            throw e;
        }
    }

Obrigado Guj.

Criado 9 de novembro de 2010
Ultima resposta 9 de nov. de 2010
Respostas 4
Participantes 2