Como pegar um pixel de uma imagem

7 respostas
V

Gente gostaria de saber como que faço pra pegar um pixel de uma imagem que estou usando em um programa
…

depois de criar uma variavel do tipo BufferedImage, fazer as operações pra ela aparecer na janela e tal…gostaria de saber como pegar um pixel desta imagem pra poder fazer um filtro da média futuramente

usei o método image.getRGB(w,h)

sendo image a variavel do tipo BufferedImage e w e h variaveis que varrem a imagem pela largura e pelo comprimento
mas n está dando certo, talvez o erro até seja outro, porque também deu estouro de array em uma operação que fiz

Grato

7 Respostas

leoviniga

???

V

bom, tenho que pegar alguns pixels para quando for fazer o filtro da média, não ultrapassar os limites da imagem, para isso fiz alguns if e else…
só q não tenho certeza se o método é mesmo o getRGB(int,int)

danilomunoz

Olá,

dê uma olhada no: http://www.marvinproject.org

Até mais,

anderson.brasil

Não entendi exatamente o que você deseja mas, veja se vc consegue tirar uma idéia deste código.
Se você postar o seu facilitaria.

package br.com.andersonbrasil.imagem;

import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;

/**
 *
 * @author Anderson de Sousa Brasil
 */
public class ImagemUtil {

    public static void main(String args[]) throws IOException {

        BufferedImage preto = ImageIO.read(new File("preto.jpg"));
        BufferedImage vermelho = ImageIO.read(new File("vermelho.jpg"));


        int pretoAltura = preto.getHeight();
        int pretoLargura = preto.getWidth();

        int vermelhoAltura = vermelho.getHeight();
        int vermelhoLargura = vermelho.getWidth();

        // cria uma imagem com a altura suficiente para guardar as duas imagens: alturaDaImagem1 + alturaDaImagem2
        BufferedImage imagemSoma = new BufferedImage(pretoLargura, pretoAltura + vermelhoAltura, BufferedImage.TYPE_INT_RGB);

        // desenha a primeira imagem em uma imagem final
        for (int i = 0; i <= pretoLargura - 1; i++) {
            for (int j = 0; j <= pretoAltura - 1; j++) {
                imagemSoma.setRGB(i, j, preto.getRGB(i, j));
            }
        }

        // desenha a segunda imagem em uma "imagem final". Começando do ponto em que a primeira foi finalizada.
        for (int i = 0; i <= vermelhoLargura - 1; i++) {
            for (int j = 0; j <= vermelhoAltura - 1; j++) {

                imagemSoma.setRGB(i, j + (vermelhoAltura), vermelho.getRGB(i, j));
            }
        }
        // escreve a imagem final em disco
        ImageIO.write(imagemSoma, "jpg", new File("imagemSoma.jpg"));

    }// fim de main
}// fim da classe

A única coisa que este código faz é unir duas imagens.

[IMG]http://img864.imageshack.us/img864/325/pretov.th.jpg[/IMG]
[IMG]http://img713.imageshack.us/img713/4793/vermelhof.th.jpg[/IMG]
[IMG]http://img7.imageshack.us/img7/601/imagemsoma.th.jpg[/IMG]

V

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
BufferedImage image;

String str = "C:/Users/Vinicius/U.F.P.B/4º Período/Processamento Digital de Imagens/1º Trabalho/Arara.jpg";
    try{
        image =  ImageIO.read(new File(str));
        ImageIcon icon = new ImageIcon(image);
        JLabel imageLabel = new JLabel(icon);
        JFrame frame = new JFrame();
        Container contentPane = frame.getContentPane();
        contentPane.setLayout(new BorderLayout());
        contentPane.add(new JScrollPane(imageLabel), BorderLayout.CENTER);
        frame.setSize(600, 400);
        frame.setVisible(true);

    int width = image.getWidth();
    int height = image.getHeight();
    frame.setTitle("Dimensões: " + height + " x " + width);
    int nbands = image.getSampleModel().getNumBands();
    Raster inputRaster = image.getData();
    int[] pixels = new int[nbands * width * height];
    inputRaster.getPixels(0, 0, width, height, pixels);

    WritableRaster teste;

    int[][] r = new int[width][height];
    int[][] g = new int[width][height];
    int[][] b = new int[width][height];
    
    int[][] mediaR = new int[width][height];
int[][] mediaG = new int[width][height];
int[][] mediaB = new int[width][height];

    Color rgb = null;
    
    
    for(int w = 0; w < width; w++){
        for(int h = 0; h < height; h++){

            rgb = new Color(image.getRGB(w,h));
            
            r[w][h] = rgb.getRed();
            g[w][h] = rgb.getGreen();
            b[w][h] = rgb.getBlue();

            teste = image.getRaster();
            
            mediaR[w][h] = (1/9 * ( r[w-1, h-1]  +  r[w-1, h]  +  r[w-1, h+1] +
                               	     + r[w , h-1]  +  r[w  , h]  +  r[w  , h+1] +
                              	     + r[w+1, h-1]  +  r[w+1, h]  +  r[w+1, h+1] ));

		

		mediaG[i][j] = 1/9 * ( g[w-1, h-1]  +  g[w-1, h]  +  g[w-1, h+1] +
                               	     + g[w , h-1]  +  g[w , h]  +  g[w , h+1] +
                              	     + g[w+1, h-1]  +  g[w+1, h]  +  g[w+1, h+1] );

		

		mediaB[i][j] = 1/9 * ( b[w-1, h-1]  +  b[w-1, h]  +  b[w-1, h+1] +
                               	     + b[w , h-1]  +  b[w , h]  +  b[w , h+1] +
                              	     + b[w+1, h-1]  +  b[w+1, h]  +  b[w+1, h+1] );
int rgb1[] = new int [3];

rgb1[0] = mediaR[w][h];

rgb1[1] = mediaG[w][h];

rgb1[2] = mediaB[w][h];

teste.setPixel(w, h,rgb1);
}
        }
    }catch(IOException ex){}

}

ta aí o codigo…a função deve fazer um filtro da média, o filtro da media se baseia no seguinte: pega-se um ponto na imagem(faz isso com todos) aí pega todos os pontos ao seu redor, os 3 de cima…de baixo…e as laterais… soma eles e divide por 9, eh um filtro de suavização…ta dando erro nessa parte do codigo de incompatibilitade int int[][] … mas ao fazer uma variavel int pra receber o valor, q tbm eh um int…da o mesmo erro…aí ja n sei mais como fazer

anderson.brasil

Altere a linha:

teste = image.getRaster();
mediaR[w][h] = (1/9 * ( r[w-1, h-1] + r[w-1, h] + r[w-1, h+1] +
+ r[w , h-1] + r[w , h] + r[w , h+1] +
+ r[w+1, h-1] + r[w+1, h] + r[w+1, h+1] ));

Para:

teste = image.getRaster();
mediaR[w][h] =  (r[w - 1][h - 1] + r[w - 1][h] + r[w - 1][h + 1] + r[w][h - 1] + r[w][h] + r[w ][h + 1] + r[w + 1][ h - 1] + r[w + 1][ h]+ r[w + 1][ h + 1]  );
e depois divida por 9.

Veja:
mediaR[w][h] = ( r[w - 1 , h - 1] );
mediaR[w][h] = ( r[w - 1] [ h - 1] ); // sem vírgula <---------------

Acho que isso possa resolver uma parte do problema.

V

n acredito q eu tinha feito isso --’
mas vlw pela ajuda, corrigiu o erro sim…mas agora está dando estouro de array…mesmo com o tratamento que eu fiz:

/* Tratamento para o caso de os pontos forem vizinhos aos limites da imagem */
if( (w == 0) && (h == 0) ){ // 1º ponto de todos: tira-se os “w-1” e “h-1”
mediaR[w][h] = ( r[0][0] + r[0][h] + r[0][h+1] +
r[w][0] + r[w][h] + r[w][h+1] +
r[w+1][0] + r[w+1][h] + r[w+1][h+1] ) / (9);

mediaG[w][h] = ( g[0][0]  +  g[0][h]  +  g[0][h+1] +
                                 g[w][0]  +  g[w][h]  +  g[w][h+1] +
                                 g[w+1][0]  +  g[w+1][h]  +  g[w+1][h+1] ) / (9);

		mediaB[w][h] = ( b[0][0]  +  b[0][h]  +  b[0][h+1] +
                               	 b[w][0]  +  b[w][h]  +  b[w][h+1] +
                              	 b[w+1][0]  +  b[w+1][h]  +  b[w+1][h+1] ) / (9);
            }
            else if( (w == 0) && (h != 0) ){ // 1ª linha: tira-se os "w-1"
                mediaR[w][h] = ( r[0][h-1]  +  r[0][h]  +  r[0][h+1] +
                                 r[w][h-1]  +  r[w][h]  +  r[w][h+1] +
                                r[w+1][h-1]  +  r[w+1][h]  +  r[w+1][h+1] ) / (9);

		mediaG[w][h] = ( g[0][h-1]  +  g[0][h]  +  g[0][h+1] +
                                     g[w][h-1]  +  g[w][h]  +  g[w][h+1] +
                              	 g[w+1][h-1]  +  g[w+1][h]  +  g[w+1][h+1] ) / (9);

		mediaB[w][h] = ( b[0][h-1]  +  b[0][h]  +  b[0][h+1] +
                               	 b[w][h-1]  +  b[w][h]  +  b[w][h+1] +
                              	 b[w+1][h-1]  +  b[w+1][h]  +  b[w+1][h+1] ) / (9);
            }
            else if( (h == 0) && ( w != 0) ){ // 1ª coluna: tira-se os "h-1"
                mediaR[w][h] = ( r[w-1][0]  +  r[w-1][h]  +  r[w-1][h+1] +
                             r[w][0]  +  r[w][h]  +  r[w][h+1] +
                             r[w+1][0]  +  r[w+1][h]  +  r[w+1][h+1] ) / (9);

		mediaG[w][h] = ( g[w-1][0]  +  g[w-1][h]  +  g[w-1][h+1] +
                                     g[w][0]  +  g[w][h]  +  g[w][h+1] +
                              	 g[w+1][0]  +  g[w+1][h]  +  g[w+1][h+1] ) / (9);

		mediaB[w][h] = ( b[w-1][0]  +  b[w-1][h]  +  b[w-1][h+1] +
                               	 b[w][0]  +  b[w][h]  +  b[w][h+1] +
                              	 b[w+1][0]  +  b[w+1][h]  +  b[w+1][h+1] ) / (9);
            }
            else if( (w == width - 1) && (h != 0) ){ // ultima linha: tira-se os "w+1"
                mediaR[w][h] = ( r[w-1][h-1]  +  r[w-1][h]  +  r[w-1][h+1] +
                             r[w][h-1]  +  r[w][h]  +  r[w][h+1] +
                             r[0][h-1]  +  r[0][h]  +  r[0][h+1] ) / (9);

		mediaG[w][h] = ( g[w-1][h-1]  +  g[w-1][h]  +  g[w-1][h+1] +
                                     g[w][h-1]  +  g[w][h]  +  g[w][h+1] +
                              	 g[0][h-1]  +  g[0][h]  +  g[0][h+1] ) / (9);

		mediaB[w][h] = ( b[w-1][h-1]  +  b[w-1][h]  +  b[w-1][h+1] +
                               	 b[w][h-1]  +  b[w][h]  +  b[w][h+1] +
                              	 b[0][h-1]  +  b[0][h]  +  b[0][h+1] ) / (9);
            }
            else if( (h == height - 1) && (w != 0) ){ // ultima coluna: tira-se os "h+1"
                mediaR[w][h] = ( r[w-1][h-1]  +  r[w-1][h]  +  r[w-1][0] +
                             r[w][h-1]  +  r[w][h]  +  r[w][0] +
                             r[w+1][h-1]  +  r[w+1][h]  +  r[w+1][0] ) / (9);

		mediaG[w][h] = ( g[w-1][h-1]  +  g[w-1][h]  +  g[w-1][0] +
                                     g[w][h-1]  +  g[w][h]  +  g[w][0] +
                              	 g[w+1][h-1]  +  g[w+1][h]  +  g[w+1][0] ) / (9);

		mediaB[w][h] = ( b[w-1][h-1]  +  b[w-1][h]  +  b[w-1][0] +
                               	 b[w][h-1]  +  b[w][h]  +  b[w][0] +
                              	 b[w+1][h-1]  +  b[w+1][h]  +  b[w+1][0] ) / (9);
            }
            else if( (w == width - 1) && (h == height - 1) ){ // ultimo ponto: tira-se os "w+1" e "h+1"
                mediaR[w][h] = ( r[w-1][h-1]  +  r[w-1][h]  +  r[w-1][0] +
                             r[w][h-1]  +  r[w][h]  +  r[w][0] +
                             r[0][h-1]  +  r[0][h]  +  r[0][0] ) / (9);

		mediaG[w][h] = ( g[w-1][h-1]  +  g[w-1][h]  +  g[w-1][0] +
                                     g[w][h-1]  +  g[w][h]  +  g[w][0] +
                              	 g[0][h-1]  +  g[0][h]  +  g[0][0] ) / (9);

		mediaB[w][h] = ( b[w-1][h-1]  +  b[w-1][h]  +  b[w-1][0] +
                               	 b[w][h-1]  +  b[w][h]  +  b[w][0] +
                              	 b[0][h-1]  +  b[0][h]  +  b[0][0] ) / (9);
            }

            r[w][h] = mediaR[w][h];
            g[w][h] = mediaG[w][h];
            b[w][h] = mediaB[w][h];

            if(r[w][h] > 255)   r[w][h] = 255;
            if(g[w][h] > 255)   g[w][h] = 255;
            if(b[w][h] > 255)   b[w][h] = 255;
            if(r[w][h] < 0)     r[w][h] = 0;
            if(g[w][h] < 0)     g[w][h] = 0;
            if(b[w][h] < 0)     b[w][h] = 0;

            int rgb1[] = new int [3];
            rgb1[0] = r[w][h];
            rgb1[1] = g[w][h];
            rgb1[2] = b[w][h];
            teste.setPixel(w, h,rgb1);
Criado 13 de maio de 2011
Ultima resposta 14 de mai. de 2011
Respostas 7
Participantes 4