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