Java: Como ler, editar e salvar imagens (ImageIO)

Palavras-chave: imagem, imagens, ler, salvar, carregar, editar, JPG, JPEG, GIF, PNG, imageio

Ler e escrever arquivos de imagens em Java é tão fácil que até nem parece Java:

BufferedImage imagem = ImageIO.read(new File("mariabonita.gif"));
// fazer algo com a imagem...
ImageIO.write(imagem, "PNG", new File("mariabonita.png"));

Já que foi fácil, vamos aproveitar esta dica para aprender também como alterar os pixels da imagem. Para isso, use os métodos getRGB()/setRGB() da classe BufferedImage. O método getRGB() retorna um array de int que representa os valores RGB de cada ponto da imagem.

Se você tivesse uma matriz, você poderia referenciar os pixels como matriz[lin][col]. Mas, aqui, como na maioria dos programas de processamento de imagens, temos um array para representar a imagem. Assim, temos que usar a notação pixels[w * lin + col], onde w é a largura da imagem.

O exemplo a seguir lê uma imagem, colore-a de maneira aleatório-psicodélica e a salva em outro arquivo:

BufferedImage imagem = ImageIO.read(new File("qualquer.jpg"));
int w = imagem.getWidth();
int h = imagem.getHeight();
int[] pixels = imagem.getRGB(0, 0, w, h, null, 0, w);
Random r = new Random();

for (int col = 0; col < w; col++) {
  for (int lin = 0; lin < h; lin++) {
    pixels[w * lin + col] =
      new Color(r.nextInt(255), col % 255, lin % 255).getRGB();
  }
}

imagem.setRGB(0, 0, w, h, pixels, 0, w);
ImageIO.write(imagem, "PNG", new File("arteabstrata.png"));
This entry was posted in Java. Bookmark the permalink.

22 Responses to Java: Como ler, editar e salvar imagens (ImageIO)

  1. devan says:

    Gostei muito do artigo….

  2. Adran says:

    Muito bom o seu artigo, mas eu gostaria de lhe fazer uma pergunta, provavelmente de iniciante -.-
    Eu preciso criar uma matriz[][] a partir de uma bmp monocromatica.
    Tentei carregar para um buffered image, e criei um laço for para transferir pixel a pixel a informação da imagem no buffer para a matriz. Mas não funcionou corretamente.
    Por favor, poderia me dizer como consigo fazer isso?

    • Durval says:

      Faça a alteração seguinte no código acima:

      for (int col = 0; col < w; col++)
      for (int lin = 0; lin < h; lin++)
      matriz[col][lin] = pixels[w * lin + col];

  3. Rui Nunes says:

    Gostei do artigo, contudo e como sou um principiante em JAVA, e tenho um trabalho para fazer estou bastante desorientado com a linguagem.
    Gostaria de obter o código fonte para a seguinte situação:

    1º- Pretendo abrir uma janela e através dela escolher um ficheiro de imagem;

    2º- Depois de ter a imagem aberta, queria fazer a ampliação e a redução da mesma.

    Pode ser simples para vocês, mas para mim é bastante complicado.

    Gostaria que me ajudassem, enviando-me o código fonte em JAVA urgentemente.

    Muito obrigado pela ajuda, desde já.
    Rui Nunes

  4. ramon says:

    brother manda pra mim tb estou com esse mesmo problema, porfavor não sei oq fazer

  5. waldemar says:

    Caro amigo,
    Estou precisando pegar os pixels e colocar em uma matriz e gravar em txt, para poder fazer calculo de algoritmo genetico!
    se puder me ajudar agradeço!

  6. triplox says:

    muito bom, mas diga-me: vc poderia nos informar como posso redimensionar a imagem tambem, mas que seja um redimensionamento automático, sem definir altura e largura (JSP ou em servlet).

    Obrigado.

    • Zé Rodolfo says:

      isso aki deve resolver seu problema, caso seja redimensionar no próprio java.

      ImageIcon img = new ImageIcon (Form.class.getClassLoader().getResource(“Imagens/botões/controle/btoExcluir.png”));

      img.setImage(img.getImage().getScaledInstance(50, 50, 100));

      Espero ter ajudado

  7. Du says:

    Como faço para ao clicar em determinados pontos da imagem (esses pontos podem ser pré-definidos), fique de forma que ao clicar nesses pontos, ele mude de cor e não de forma aleatória, e sim cores que eu mesmo defino?

    • Zé Rodolfo says:

      tenta usar botões, e neles vc define as cores que quer usar, talvez funcione.. rsrs
      ou não.. :(

  8. thiago lopes says:

    Amigo estou utilizando o eclipse galileu e estou tendo dificuldade em importar imagens para um pacote, ou seja, não estou conseguindo achar nenhuma opção que me mostre para eu fazer esta opção.Você poderia me ajudar por favor?
    Fico no aguardo…

  9. Vanderci Eduardo says:

    Gostaria de saber como faço para enviar uma imagem (foto) pela rede para uma pasta e, caso haja um outro arquivo com o mesmo nome, renomear o que está sendo gravado, adicionando _1, _2, _3 e assim por diante.

  10. Thiago dos Santos Maciel says:

    Meu problema está sendo com o tipo de extensão da imagem (no caso, .ppm). O BufferedImage não tá abrindo essa extensão…
    O programa que quero fazer é, dada uma imagem .ppm original e, quando o usuário passar algumas coordenadas, através dessas, fazer um corte na imagem e salvar só a parte referente ao recorte em outro arquivo .ppm
    Alguém pode me dá uma idéia de como resolver essa bronca?

  11. Thiago says:

    Gostaria de saber se tem como redimensionar a imagem??

  12. Pablo says:

    Idem, to quase ficando loco com isso xD

  13. Marcus Cesar says:

    Boa tarde
    Estou precisando ler os dados de uma imagem e gravar em banco de dados…por exemplo:
    Uma foto que contenha o número 152552, em alguma parte.

    Agradeço desde já

    Marcus

  14. eduardo says:

    Olá, gostei muito do seu artigo, você usou uma abordagem de facil entendimento. Está de parabéns.
    Porém estou fazendo um trabalho de faculdade e estou tendo dificuldades para implementa-lo.
    Aí vai…
    Como faço para comparar duas imagens e ver se elas são iguais. E se forem diferentes, como detectar essas diferenças entre as imagens…
    Se você puder me ajudar ficarei grato ou pelo menos me colocar no caminho certo…
    Desde já agradeço
    Desde já agradeço

  15. yasmine says:

    Adorei!
    Gostaria de saber como pegar cada pixel da imagem e transformá la em outra imagem de tamanho maior, como um foto mosaico.. se puder ajudar!

  16. Roberto says:

    Olá, como faria a extração de uma imagem de um banco de dados?

  17. kelton says:

    pergunta:
    como separar um gif em partes?

Comments are closed.