Pq naum funciona?

aee pessoal, to precisando da ajuda de vcs novamente!!!
eu to precisando fazer um programa q mostre uma imagem e a armazene em um objeto Raster. Eu acho q consegui armazenar a imagem no objeto Raster, pq quanto eu dou raster.getWidth ou raster.getHeigth eu consigo pegar as dimensões da minha imagem, mas soh que eu naum to conseguindo mostrar a imagem corretamente no Canvas, ela aparece desconfigurada. Se alguem puder me ajudar agradeço

Valeu

Código da classe principal

import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import java.awt.image.*;
import java.net.URL;
import java.net.URL;
import java.io.*;
import javax.imageio.ImageIO;


public class TrabFatima3 extends javax.swing.JFrame {
    JButton  jButton1;
    JFrame frame;
    JFileChooser chooser;
    JLabel label,label2;
    String nomearq,nomepath,arquivo;
    Container container;
    JPanel painelImagem = new JPanel();
    JPanel painelAlturaLargura = new JPanel();
    int nCols;
    int nLins;
    MyCanvas c1;
    
    public TrabFatima3() {
        
        
        try {
            setSize(1024,768);
            
            
            
            //declaração do botão
            jButton1 = new javax.swing.JButton();
            
            container = getContentPane();
            container.setLayout(new BorderLayout());
            
            //Operação de fechamento de frame
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            
            //Cria painel para botao
            JPanel painelBotao = new JPanel();
            
            //Adiciona botão no painel
            painelBotao.add(jButton1);
            
            //Adiciona Painel de botão na frame
            container.add(painelBotao, BorderLayout.SOUTH);
            
            //Evento no Botão para selecionar a imagem
            jButton1.setText("Procurar");
            
            jButton1.addMouseListener(new MouseAdapter() {
                public void mouseClicked(MouseEvent e) {
                    frame   = new JFrame("Carregar Imagem");
                    chooser = new JFileChooser();
                    chooser.showOpenDialog(frame);
                    chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
                    
                    // Pegar o arquivo no diretório
                    File file = chooser.getSelectedFile();
                    
                    //carregar o arquivo
                    if (file==null || file.getName().equals(""))
                        System.out.println("nome do arquivo inválido: ");
                    else {
                        nomearq = file.getName();
                        nomepath= file.getPath();
                        arquivo = nomepath;
                        
                        System.out.println("nome do arquivo: "+arquivo);
                        
                        URL url = null;
                        try {
                            url = file.toURL();//fornece o path do arquivo na forma file:/C:/.....
                            System.out.println("URL: "+url);
                        } catch (Exception exception) {
                        }
                        
                        c1 = new MyCanvas(null);
                        GreyImage gi;
                        Raster rs = null;
                        try {
                            gi = GreyImage.createImage(url);
                            c1.setImage(gi);
                            rs = gi.getRaster();
                            nCols = rs.getWidth();
                            nLins = rs.getHeight();
                        }catch(IOException IOe) {
                            IOe.printStackTrace();
                        }
                        
                        //adiciona a altura e largura em outro label
                        label2 = new JLabel("Altura: "+nCols+"      Largura: "+nLins, SwingConstants.CENTER);
                        
                        //limpa paineis (para nova imagem aberta)
                        painelImagem.removeAll();
                        painelAlturaLargura.removeAll();
                        
                        //adiciona labels aos paineis
                        painelImagem.add(c1);
                        painelAlturaLargura.add(label2);
                        
                        //adiciona os dois paineis no container
                        container.add(painelImagem, BorderLayout.CENTER);
                        //  container.add(c1, BorderLayout.CENTER);
                        container.add(painelAlturaLargura, BorderLayout.NORTH);
                        
                        frame.pack();
                        frame.setVisible(false);
                        
                        //atualiza frame
                        container.validate();
                    }
                }});
                
        }catch(Exception e) {
            e.printStackTrace();
        }
        
        show();
    }
    
   /* 
    void Media() {
        
        
        int l,c,tl,tc;
        float soma;
        int Sl;
        
        
        for(l=1;l==nLins-2;l++) {
            for(c=1;c==nCols-2;c++) {
                soma=0;
                for(tl=l-1;tl==l+1;tl++) {
                    for(tc=c-1;tc==c+1;tc++) {
                        soma=soma+
                    }
                }
            }
            
        }

        
    }*/
    
    public static void main(String args[]) {
        new TrabFatima3();
    }
    
}

essa a classe do meu canvas


import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.image.*;
import java.net.URL;

import java.net.URL;
import java.io.*;
import javax.imageio.ImageIO;

public class MyCanvas extends Canvas {
    BufferedImage bi;
    
    public MyCanvas(BufferedImage b) {
        
        bi = b;
    }
    
    public void paint(Graphics g) {
        System.out.println(bi);
        if ( getImage() != null )
            g.drawImage(getImage(), 0, 0, null);
    }
    
    public BufferedImage getImage() {
        return bi;
    }
    
    public void setImage(BufferedImage b) {
        repaint();
        bi = b;
        setSize(new Dimension(b.getWidth(),b.getHeight()));
    }
    
}

e essa aqui eh uma outra classe que eu utilizei para pegar a imagem, vários metodos dela eu nao estou utilizando


//package images;
import java.net.URL;
import java.awt.*;
import java.awt.image.*;
import java.io.*;//utilizado no throws IOException
import javax.imageio.ImageIO;// utilizado para o read do ImageIO.read()


public class GreyImage extends BufferedImage
{
	
	public GreyImage(int w, int h)
	{
		super(w,h, TYPE_BYTE_GRAY);
	}
	
	
	static public GreyImage createImage(URL m)
			throws IOException
	{

		Toolkit tc = Toolkit.getDefaultToolkit();
		Image im =  ImageIO.read(m);
		BufferedImage bi = (BufferedImage) im;

		GreyImage gi = new GreyImage(bi.getWidth(), bi.getHeight());
		gi.setData(bi.getRaster());
		return gi;
	}
	
    public int[] original(int k)
    {
	   Raster rs = getRaster();
	   int nCols = rs.getWidth();
	   int nLins = rs.getHeight();
	   int[] I = rs.getPixels(0, 0, nCols, nLins, (int[]) null);
	   
      return I;
	}
 
   
	public int[] threshold(int thres)
	{
	   Raster rs = getRaster();
	   int nCols = rs.getWidth();//numero de colunas
	   int nLins = rs.getHeight();//numero de linhas
	   int index = 0;
	   int[] I = rs.getPixels(0, 0, nCols, nLins, (int[]) null);//numero de pixel da imagem
	   int[] dy = (int []) I.clone();//numero de pixel da imagem
         
	   for (int i = 0; i < nLins ; i++)
	   {
	      for (int j = 0; j < nCols; j++)
		  {
		     if ((I[i * nCols + j])> thres)
                dy[index++] = 255;//se fizermos receber 0 ou 255 o fundo ficará preto
             else
			    dy[index++] = 0;
	     }//fim do for
	   }//fim do for					
	   
	   return dy;
	}
	
    public int[] boxRim(int box)
    {
      Raster rs = getRaster();
      int nCols = rs.getWidth();
      int nLins = rs.getHeight();
      int[] I = rs.getPixels(0, 0, nCols, nLins,(int[]) null);
      int[] dy = (int []) I.clone();
      int i,j,k,l,cor,cor1;
      int mat[][]=new int[nLins][nCols];
      double contr;
      double Melhoria_Ponto[][] = {{0.75,0.75,0.75},
					            {0.75,1,0.75},
					            {0.75,0.75,0.75}};
					
      //laço que transforma a imagem em uma matriz com seus valores de cinza
      for(i=0; i<nLins; i++)
	  {  
	     for (j=0; j<nCols; j++)
		 {
            mat[i][j]=I[i * nCols + j];
	     }//fim do for
      }// fim do for   
  
      for(i=4; i<nLins-4; i++)
      {  
	     for (j=4; j<nCols-4; j++)
         {
            contr=0;
	   
            for(k=-1; k<2; k++)
	           for(l=-1; l<2; l++)
			      contr=contr + (mat[i+k][j+l]*Melhoria_Ponto[l+1][k+1]);
		  
		    for(k=3; k<5; k++)
	           for(l=-4; l<5; l++)
		       {
	              contr=contr - (mat[i+k][j+l]*0.125);
		          contr=contr - (mat[i-k][j+l]*0.125);//erro
               }// fim dor for
		
            for(k=-2; k<3; k++)
	           for(l=3; l<5; l++)
		       {
	              contr=contr - (mat[i+k][j+l]*0.125);
		          contr=contr - (mat[i+k][j-l]*0.125);
		       }//fim do for
	
		    if(contr>255)
	           contr=255;
            
			if (contr<0)
	           contr=0;
		 
            dy[i*nCols+j]= (int) Math.round(contr);
	     }//fim do for	
      }//fim dor for
      return dy;
   }// fim do boxRim



   public int[] thresholdG(double thresG)
   {
      Raster rs = getRaster();
      int nCols = rs.getWidth();
      int nLins = rs.getHeight();
      int index=0;
      int[] I = rs.getPixels(0, 0, nCols, nLins,(int[])null);
      int[] dy = (int []) I.clone();
      int[] Histograma = new int[256];
      double NumPontos,contador;
      int cor,i,h,j,w,l;
      int mat[][]=new int[nLins][nCols];

      //for 1: armazena na matriz mat[i][j] a imagem que está no vetor I[]
      for (i = 0; i < nLins; i++)
	  { 
         for (j = 0; j< nCols; j++) 
		 {
	        mat[i][j]=I[i * nCols + j];
		 }//fim do for
	  }// fim do for

	  System.out.println(+nCols);
	  System.out.println(+nLins);

      //for 2: inicialliza todas as posições do vetor Histograma[i]=0
	  for (i=0; i==255; i++)
         Histograma[i]=0;
 
	  //for 3: percorre toda a matriz mat[i][j] e armazena na variavel cor os valores
	  //de nivel de cinza de cada pixel
	  //o vetor Histrograma[cor] armazenará a quantidade de cada nivel de cinza da imagem
	  for (i = 0; i < nLins; i++) 
         for (j = 0; j< nCols; j++) 
	     {
	        cor=mat[i][j];
	        Histograma[cor]= Histograma[cor]+1;
         }// fim do for
	  
      contador=0;
	  i=0;
	  h=nLins;
	  w=nCols;
	  NumPontos=h*w;
         
	  while(contador <(NumPontos*thresG))
	  {
	     contador=contador+Histograma[i];
	     i=i+1;
	     if (i>255) break;//i deve para em 255, porque o tamanho do vetor Histograma[i]==256.
	  }// fim do while
   
      if (i>255)
	     i=255;

      for (l = 0; l <nLins; l++)
	  {
         for (j = 0; j<nCols; j++) 
	     {
	        mat[l][j]=I[l * nCols + j];
	        cor=mat[l][j];

	        if (cor<=(i-1))
	           dy[index++] = 0;
	        else 
	           dy[index++] = 255;
	     }//fim do for
      }// fim do for
      return dy;
   }// fim do thresholG


   public int[] MMatematicaBinaria(double mate)
   {
      Raster rs = getRaster();
      int nCols = rs.getWidth();
      int nLins = rs.getHeight();
      int index = 0;
      int[] I = rs.getPixels(0, 0, nCols, nLins,(int[])null);
      int[] dy = (int []) I.clone();
      int p1,p2,p3,p4,p5,i,j, eliminar;
      int mat[][]=new int[nLins][nCols];
   
      for(i=0; i<nLins; i++)
	  {
	     for (j=0; j<nCols; j++)
	     {
            mat[i][j]=I[i * nCols + j];
	     }//fim do for	
      }// fim do for

	  for(i=1; i<nLins-2; i++)
      {  
	     for (j=1; j<nCols-2; j++)
         {
            eliminar=1;
	        p1=mat[i][j-1];
	        p2=mat[i-1][j];
	        p3=mat[i][j+1];
	        p4=mat[i+1][j];
	        p5=mat[i][j];
		
		    if (p1+p2+p5==765) eliminar=0;
            if (p1+p4+p5==765) eliminar=0;
            if (p2+p3+p5==765) eliminar=0;
            if (p3+p4+p5==765) eliminar=0;
            if (p1+p3+p5==765) eliminar=0;
		    if (p2+p4+p5==765) eliminar=0;
		 
		    if(eliminar==1)
		       dy[i*nCols+j]=0;
         }//fim do for
      }// fim do for
      return dy;
   }//fim MMatematicaBinaria
  
   public int[] thresholdL(double NS_DP)
   {
      Raster rs = getRaster();
      int nCols = rs.getWidth();
      int nLins = rs.getHeight();
      int index = 0;
      int[] I = rs.getPixels(0, 0, nCols, nLins,(int[])null);
      int[] dy = (int []) I.clone();
      int mat[][]=new int[nLins+56][nCols+56];
      int i,j;
   
      for(i=0; i<nLins; i++)
	  {
	     for (j=0; j<nCols; j++)
	     {
            mat[i][j]=I[i * nCols + j];
	     }//fim do for
      }//fim do for

      for(i=0; i<nLins-1; i++)
      {
	     for (j=0; j<nCols-1; j++)
	        if (mat[i][j]==255)
		    { 
			   int l,k,xSup,ySup, xInf,yInf;
	           double somador, media, DesvioPadrao,s;
               somador=0;
	           
		       if (i>25)   
			     xInf=25;
	           else        
			     xInf=i;
	
	           if (i<nLins-26) 
			     xSup=25;
	           else   
			     xSup=nLins-(i+1);

	           if(j>25)    
			     yInf=25;
		       else         
			     yInf=j;
        
		       if (j<nCols-26) 
			     ySup=25;
	           else   
			     ySup=nCols-(j+1);
               
			   for (l=i-xInf; l<i+xSup; l++)//a partir do i=206 dá erro 
	              for(k=j-yInf; k<j+ySup; k++)
	                 somador = somador + mat[l][k];
		     
		       media= somador/((xSup+xInf+1)*(ySup+yInf+1));
	           somador=0;
		
		       for (l=i-xInf; l<i+xSup; l++)
	              for(k=j-yInf; k<j+ySup; k++)
	                 somador = somador+ (double) Math.pow((mat[l][k]-media),2);
			  
	           DesvioPadrao= (double) Math.sqrt(somador /((xSup + xInf + 1)*(ySup + yInf + 1)));
		
		       if (mat[i][j]<(media + (NS_DP*DesvioPadrao)))
		          dy[i*nCols+j]=0;
	        }//fim do if
	  }//fim do for
      return dy;
   }//fim thresholdL

 
}

valeu galera pela ajuda

aeee galera o erro q tava dando eu consegui arrumar, pra galera q tentou arrumar o negocio pq a imagem ficava cinza era o parametro q eu passava pra inicializar a minha classe GreyImage (ta certo q a classe era para deixar a imagem em tons de cinza… mas tinha esquecido disso :oops: ) eh soh trocar o parametro dessa linha na classe:

super(w,h, TYPE_BYTE_GRAY);
por:
super(w,h, TYPE_3BYTE_BGR);

falow e foi maus hein

ow pra aproveitar o tópico aqui vai uma outra pergunta pra qm jah trabalho com a classe Raster.
tipo eu tenho o meu objeto raster e queria saber se tem como eu pegar os pixels da imagem q tenha a cor vermelha???

valeu