Obtenção e transformação de imagem

3 respostas
F

Pessoal, estou com problemas para a execução desse código:

Construa um programa em Java que solicite e leia do teclado o caminho e o nome de um arquivo de imagem do tipo JPG e
em seguida leia pixel por pixel dessa imagem inserindo os valores em uma matriz de números inteiros. Depois chame um
método que recebe como parâmetro a matriz, e as dimensões da imagem e retorne a matriz alterada. Dentro desse método
será feito a manipulação dos pixels da imagem. Finalmente, depois da chamada do método, grave a matriz alterada em um
novo arquivo JPG.
*/

package exercicio1;
import java.awt.image.BufferedImage;
import java.awt.image.SampleModel;
import java.awt.image.WritableRaster;
import javax.swing.*;
import java.io.*;
import javax.imageio.ImageIO;
import javax.media.jai.*;
import javax.media.jai.iterator.RandomIter;
import javax.media.jai.iterator.RandomIter.*;
import javax.media.jai.iterator.RandomIterFactory;

public class Exemplo1 {

    public static void main(String[] args) throws IOException {
//solicitando e lendo o caminho e o nome do arquivo
        String cn = JOptionPane.showInputDialog("Digite o caminho, o nome e a extensão do arquivo");
        //carregando o arquivo de imagem
        PlanarImage pi = JAI.create("fileload",cn);
        //obtendo as dimensões da imagem
        int larg = pi.getWidth();
        int alt = pi.getHeight();
        //declarando e inicializando a matriz de pixels
        int M[][] = new int[alt][larg];
        //obtendo o número de bandas da imagem
        SampleModel sm = pi.getSampleModel();
        int nband = sm.getNumBands(); // nband recebe o número de bandas. Se nband = 1 é cinza, se nband = 3 entao colorida
        int pixel[] = new int[nband];
        //Preparando as iterações de leitura da imagem
        RandomIter iterator = RandomIterFactory.create(pi,null);
        // extraindo os pixels da imagem e armazenando-os em uma matriz
        for(int a=0; a<=alt; a++){
            for(int l=0; l<larg; l++){
            iterator.getPixel(a,l,pixel);
            M[a][l] = pixel[0];
            }
        }
        //processamento
        //Public static void processamento (int M[][], int alt, int larg){}
            
        
        //

        //gravando a matriz alterada em um arquivo.jpeg
        BufferedImage image = new BufferedImage(alt, larg, BufferedImage.TYPE_BYTE_GRAY);//gravo a imagem no buffer // gray imagens em cinza
        WritableRaster raster = image.getRaster();//estou gravando no disco //getRaster() é um método da classe

        for(int a=0; a<=alt; a++){
            for(int l=0; l<larg; l++){
            raster.setSample(l,a,0,M[a][l]);
        cn = JOptionPane.showInputDialog("Digite o caminho, o nome e a extensão do arquivo da imagem alterada");
        ImageIO.write(image,"JPG", new File(cn));//pego a imagem que está no buffer e jogo no arquivo
        // ou -> ImageIO.write(image,"JPG",new File("c:/images/imagem_retocada.jpg"));
            }
        }
    }

}

Resulta em:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 256
                  at com.sun.media.jai.iterator.RandomIterFallback.makeCurrent(RandomIterFallback.java:102)
                  at com.sun.media.jai.iterator.RandomIterFallback.getPixel(RandomIterFallback.java:141)
                  at exercicio1.Exemplo1.main(Exemplo1.java:46)
          Java Result: 1

O que posso fazer moçada ?

Precisarei também transladar, rotacionar e mudar a escala dessa imagem.

Obrigado

3 Respostas

ViniGodoy

No for da linha 39, faça somente
a < alt

Não <=, como está escrito.

F

Alterei conforme correção mencionada, mas quando entra no segundo “for” , ele fica em loop infinito e não carrega a imagem.

Me ajude por favor

Obrigado pela ajuda anterior

ViniGodoy

As linhas 58 e 59 deveriam estar fora do for. E o loop não é infinito, só é demorado e chato.
Uma imagem de 800x600 tem 480.000 pixels… e seria o número de vezes que a caixinha iria pular na sua tela.

Criado 26 de junho de 2010
Ultima resposta 26 de jun. de 2010
Respostas 3
Participantes 2