Problemas para armazenas pedaço de uma imagem em outra

4 respostas
R

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!!!!!!

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);
  }

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.

4 Respostas

GabrielGarcia

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.

R

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)
GabrielGarcia

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?

R
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)
/*
 * 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);
  } 
}

Criado 23 de junho de 2009
Ultima resposta 25 de jun. de 2009
Respostas 4
Participantes 2