domingo, 17 de junho de 2012

JImageResizer, redimensionando imagens em lote com Thumbnailator e WindowBuilder Pro

Semana passada eu procurei um plugin para trabalhar com Swing no Eclipse e para minha surpresa descobri que o Google tinha lançado o WindowBuilder Pro, um plugin para o Eclipse que se provou até agora ser o melhor para edição de layout para Java, dando suporte a Swing e GWT.

WindowBuilder Pro


Muitas vezes eu corria para o Netbeans quando precisava fazer algum programa em Swing, pois seu editor é amigável, mas o código gerado para os componentes UI não pode ser modificado fora do editor visual e além disso ele gera um código muito caótico para manutenção.

Depois de testar o WindowBuilder eu posso dizer que o melhor editor, fácil de usar e com muitos recursos ele trabalha de maneira bi-direcional, ou seja eu posso editar o código dos componentes tanto no editor visual quando no fonte de maneira transparente, principalmente porque ele gera um código super limpo.

Código gerado pelo WindowBuilder Pro


Outra grande vantagem é dele dar suporte alguns Layout Managers como o MiG Layout que é simples de trabalhar e bastante poderoso.

Tive a ideia de fazer um pequeno projeto para testar o WindowBuilder e resolvi criar um aplicativo muito simples de redimensionamento de imagens em lote.

Meu pai sempre me pede para redimensionar imagens para ele e eu costumo fazer isto em vários programas, então eu pensei em criar um redimensionador de imagens o simples e básico possível. Aproveitei uma ótima biblioteca criada para geração de thumbnail, o Thumbnailator e comecei o projeto.

Graças a simplicidade do Thumbnailator, a tarefa de redimensionar a imagem, salvando em outro arquivo se resumiu a esta linha abaixo.


Thumbnails.of(file).size(tamanho, tamanho).outputQuality(quality).toFile(fileDestino);



Um dos problema iniciais que eu tive foi como obter o tamanho em pixels das imagens sem precisar ler todo seu conteúdo e após uns minutos achei o código abaixo obtido neste link.

 public static Dimension getImageDimension(File file) {
  ImageInputStream in = null;
  try {
   in = ImageIO.createImageInputStream(file);
   final Iterator<ImageReader> readers = ImageIO.getImageReaders(in);
   if (readers.hasNext()) {
    ImageReader reader = (ImageReader) readers.next();
    try {
     reader.setInput(in);
     return new Dimension(reader.getWidth(0), reader.getHeight(0));
    } finally {
     reader.dispose();
    }
   }
  } catch (Exception e) {
   e.printStackTrace();
  } finally {
   if (in != null)
    try {
     in.close();
    } catch (IOException e) { }
  } 
  return null;
 }

Minha intenção desde o inicio foi criar algo Open Source, então em breve vou colocar o projeto em algum Code Hosting voltado para projetos Open Sources como o Google Code.

Atualmente estou mantendo este projeto no Assembla, que se mostrou um ótimo serviço gratuito que não obriga que o projeto seja publico. Quem tiver interesse me avisa que eu publico o zip com source aqui mesmo.

Para quem tiver interesse em usar o JImageResizer, pode fazer o download nos link abaixo:
JImageResizer 0.01