Problemas para armazenas pedaço de uma imagem em outra

Estou com um problema, to quebrando cabeça faz tempo, é o seguinte: to percorrendo uma imagem atráves dos pixels para saber o pedaço que quero cortar até ai tudo OK. Faço a compilação e tudo certo, sei que tá certo pq coloquei Dialogo de Mensagens. O problema é na hora de armazenar os pixels lido em um array BufferedImage, já tentei de tudo e não dá certo ele para o for e não vai até o final. A seguinte mensagem aparece “Exception in thread “AWT-EventQueue-0” java.lang.NullPointerException”.
Por favor me ajudem!!!

[code]
for(int x = 0; x < largura; x++) {
for(int y = 0; y < altura; y++) {
raster.getPixel(x, y, pixels);
red = pixels[0];
green = pixels[1];
blue = pixels[2];
alpha = pixels[3];

          if (red < 200) {
              posH++;
              cortaImagem--;
          }
          
          if (red > 200){
              cortaImagem++;
          }
          
          if (cortaImagem == altura){
              if (x !=posX){
                  JOptionPane.showMessageDialog(null,"Terminou leitura do caracter="+posX+","+y+" "+posW+","+posH, "Processo Imagem", JOptionPane.PLAIN_MESSAGE);
                  for (int a=posX; a<=posW; a++){
                      for (int b=posY; b<=posH; a++){
                          imagemSeparada[countImagem].setRGB(a, b, 0);
                      }
                  }
                  posX = x;
                  ++posX;
                  countImagem++;
              } else {++posX;}
          }
      }
      cortaImagem = 0;
      posW++;
 }
JOptionPane.showMessageDialog(null,"Pronto", "Processo Imagem = " + countImagem, JOptionPane.PLAIN_MESSAGE);

}[/code]

O problema é no if (cortaImagem == altura), é quando eu preciso pegar da imagem carregada o pedaço do ponto posX a posY com tamanho posW e posH. Depois tem que seguir para pegar do pedaço por adiante.

Deixe-me ver se entendi: você tem uma imagem e quer recortar apenas um pedaço dela, é isso?

Isso deve ser feito automaticamente, como se a imagem tivesse um certo padrão, ou você faz isso selecionando pontos com o mouse?

Se isto não for exatamente o que você quer fazer, ignore :wink: Mas se o seu objetivo é recortar um pedaço da imagem, faça assim:

Sua imagem carregada deve ser uma BufferedImage
Se você sabe o ponto inicial onde gostaria de começar o corte da imagem e o tamanho desta seleção, use getSubImage.

Faça assim:

Vamos supor que sua imagem carregada do disco seja a imagemOriginal…

BufferedImage recorte = imagemOriginal.getSubimage(X, Y, W, H);

Onde
X = coordenada do eixo X onde deve-se iniciar a seleção
Y = coordenada do eixo Y onde deve-se iniciar a seleção
W = tamanho, em pixels, do comprimento horizontal da área de seleção
H = tamanho, em pixels, do comprimento vertical da área de seleção

Assim, se você tem uma imagem de 1024x768 pixels, e você usar

BufferedImage recorte = imagemOriginal.getSubimage(0, 0, 120, 320);

Você vai começar a seleção pelo ponto zero da imagem (canto superior esquerdo), e recortar um retângulo de 120x320 pixels da imagemOriginal.

Depois, apenas salve a imagem.

Caso esteja com dificuldades, posso te mostrar um exemplo bem simples em como pegar a screenshot da sua tela e dividi-la e recorta-la em 8 pedaços que, se forem juntados novamente, forma a imagem.

Já fiz assim com esse código, mas aí o programa para na primeira vez que recorta a imagem.
No caso estou tentando separa caracteres de uma palavra então preciso percorrer toda a imagem cortando os pedação e colocando numa array de imagem.

O seguinte erro aparece quando percorro uma imagem.

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
        at reconhecimentofontes.LeituraDeImagens.DetectaPixel(LeituraDeImagens.java:185)
        at reconhecimentofontes.LeituraDeImagens$4.actionPerformed(LeituraDeImagens.java:113)
        at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
        at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
        at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
        at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
        at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
        at java.awt.Component.processMouseEvent(Component.java:6041)
        at javax.swing.JComponent.processMouseEvent(JComponent.java:3265)
        at java.awt.Component.processEvent(Component.java:5806)
        at java.awt.Container.processEvent(Container.java:2058)
        at java.awt.Component.dispatchEventImpl(Component.java:4413)
        at java.awt.Container.dispatchEventImpl(Container.java:2116)
        at java.awt.Component.dispatchEvent(Component.java:4243)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4322)
        at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3986)
        at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3916)
        at java.awt.Container.dispatchEventImpl(Container.java:2102)
        at java.awt.Window.dispatchEventImpl(Window.java:2440)
        at java.awt.Component.dispatchEvent(Component.java:4243)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)

O método DetectaPixel está enviando alguma informação de pixel nula.

Meio complicado de identificar sem ver todo o código.

Ou o pixel não está sendo tratado ou você está excedendo o limite da imagem.

Esse erro ocorre ao tentar recortar a imagem principal?

Se puder me ajudar preciso entregar esse trabalho na universidade até o final deste semestre e eu parei nessa parte e não to conseguindo concluir. Esse é todo o código: (em anexo estou enviando o tipo de imagem que quero analizar)

[code]
/*

  • Programa para detectar possíveis fontes encontradas
  • em uma imagem jpeg e listadas em um JList.
    */

package reconhecimentofontes;

import java.awt.;
import java.awt.color.ColorSpace;
import java.awt.event.
;
import java.awt.image.BufferedImage;
import java.awt.image.ColorConvertOp;
import java.awt.image.WritableRaster;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.image.CropImageFilter;
import java.awt.Image;
import java.awt.image.FilteredImageSource;

//Classe para carregar a imagem
public class LeituraDeImagens extends JFrame{
private BufferedImage imagem, imagemCinza, imagemBuffer, imagemSeparada[];
private JButton botaoConverter, botaoAnalizar;
AreaImagem areaImagem;
JList listaDeFontes;
String pixel;

//configura o Menu
public LeituraDeImagens()
{
        super ("Ferramenta de auxílio para identificação de Fontes");
        
        Container c = getContentPane();
        c.setLayout(new BorderLayout());
        
        //configura o menu Arquivo e seus itens
        JMenu menuArquivo = new JMenu ("Arquivo");
        menuArquivo.setMnemonic( 'q' );          
        
        //configura o item Abrir do Menu Arquivo
        JMenuItem abrir = new JMenuItem ("Abrir");
        abrir.setMnemonic( 'A' );
        
        abrir.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                JFileChooser fc = new JFileChooser();

                int res = fc.showOpenDialog(null);
                if(res == JFileChooser.APPROVE_OPTION)
                {
               File arquivo = fc.getSelectedFile();  
      
                   imagem = null;
      
                   try{ imagem = ImageIO.read(arquivo); }
                
                   catch(IOException exc)
                   {
                      JOptionPane.showMessageDialog(null, "Erro ao carregar a imagem: " + 
                      exc.getMessage());
                   }

                   if(imagem != null)
                   {
                      areaImagem.imagemBuffer = imagem; 
                      areaImagem.repaint();
                   }
                }  
                
            }
        }           
        );    
                    
        menuArquivo.add(abrir);
        
        //configura o item Sair do Menu Arquivo
        JMenuItem sair = new JMenuItem("Sair");
        sair.setMnemonic( 'r');
        
        sair.addActionListener(new ActionListener()
        {
            public void actionPerformed (ActionEvent event)
                {
                     System.exit(0);
                }
        } //fim da classe interna anônima
        ); //fim da chamada para addActionListener
        
        menuArquivo.add(sair);
        
        //cria barra de menus e a anexa à janela Menu
        JMenuBar bar = new JMenuBar();
        setJMenuBar(bar);
        bar.add(menuArquivo);
        
        botaoConverter = new JButton("Converter Escalar Cinza");
        botaoConverter.addActionListener(
                new ActionListener(){
            public void actionPerformed(ActionEvent e){
                converterEscalaCinza();
            }
                }
        );
                   
        botaoAnalizar = new JButton("Analizar Imagem");
        botaoAnalizar.addActionListener(
                new ActionListener(){
            public void actionPerformed(ActionEvent e){
                DetectaPixel();
            }
                }
        );            
        
        JPanel painel = new JPanel();
        painel.setLayout(new FlowLayout());
        painel.add(botaoConverter);
        painel.add(botaoAnalizar);
        
        c.add(painel, BorderLayout.NORTH);

        // Cria a área de exibição da imagem
        areaImagem = new AreaImagem();
        c.add(areaImagem, BorderLayout.CENTER);
        
        String fontes[ ] = GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames( );
        
        listaDeFontes = new JList(fontes);
        c.add(new JScrollPane(listaDeFontes), BorderLayout.SOUTH);

        setSize(900,800);
        setVisible(true);
        
}
//executa o aplicativo
public static void main(String args[])
{        
    LeituraDeImagens application = new LeituraDeImagens();
     
    application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

public void converterEscalaCinza(){
ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_GRAY);
ColorConvertOp op = new ColorConvertOp(cs, null);
imagemCinza = op.filter(imagem, null);
areaImagem.imagemBuffer = imagemCinza;
areaImagem.repaint();
}

public void DetectaPixel(){
int altura = imagem.getHeight();
int largura = imagem.getWidth();
int red, green, blue, alpha, countImagem=0, cortaImagem = 0;
int posX=0, posY=0, posH=0, posW=0;
int pixels[] = new int[4];
WritableRaster raster = imagem.getRaster();
int transparencia = Transparency.OPAQUE;

 for(int x = 0; x < largura; x++) {
      for(int y = 0; y < altura; y++) {
          raster.getPixel(x, y, pixels);
          red = pixels[0];
          green = pixels[1];
          blue = pixels[2];
          alpha = pixels[3];
          transparencia = Transparency.BITMASK;
          
          if (red < 200) {
              posH++;
              cortaImagem--;
          }
          
          if (red > 200){
              cortaImagem++;
          }
          
          if (cortaImagem == altura){
              if (x !=posX){
                  JOptionPane.showMessageDialog(null,"Terminou leitura do caracter="+posX+","+y+" "+posW+","+posH, "Processo Imagem", JOptionPane.PLAIN_MESSAGE);
                  imagemSeparada[countImagem] = imagemBuffer.getSubimage(posX, posY, posW, posH);
                  posX = x;
                  ++posX;
                  countImagem++;
              } else {++posX;}
          }
      }
      cortaImagem = 0;
      posW++;
 }
JOptionPane.showMessageDialog(null,"Pronto", "Processo Imagem = " + countImagem, JOptionPane.PLAIN_MESSAGE);

}

}

// Sub-classe de JPanel para exibir a imagem
class AreaImagem extends JPanel{
public BufferedImage imagemBuffer;

public void paintComponent(Graphics g){
super.paintComponent(g);

// desenha a imagem no JPanel
g.drawImage(imagemBuffer, 0, 0, this);

}
}[/code]