Newsgroup: it.comp.java
Titolo: Problemi con la creazione di un'immagine

Ciao,
sono al mio primo programma Java e sto cercando di creare un immagine a
livelli di grigio da un array di
interi. Non riesco a capire dove sbaglio ma non riesco a visualizzare
niente e il risultato e' NullPointerException.
Il codice incriminato e' il seguente:
 import java.io.*;
 import java.awt.*;
 import java.awt.image.*;
 import java.awt.event.*;
 import javax.swing.*;
 class ImmaginePanel extends JPanel
 {public ImmaginePanel()
     {long datalen=0;
     int group=0,data=0;
     boolean flag=true;
     int[] b= new int[2];
     int red=0, green=0, blue=0;
     int MaxVal=0, MinVal=65536;
     //  definiz. immagine
     int[] pix;
     //definizione di un file di input
     RandomAccessFile fileImmagine;
 try {
  fileImmagine= new RandomAccessFile(path,"r");
  do {
       pix = new int[row*col];
       for (int i=0; i < pix.length; i++) {
            red=0;
            try {
                for (int j=0;j<2;j++) b[j] =
fileImmagine.readUnsignedByte();
            }
            catch(IOException o){};  //--->  gestione eccezione!!
            if (pix[i]>MaxVal)MaxVal = pix[i];
            if (pix[i]<MinVal)MinVal = pix[i];
       }
       flag=false;
       if ((MinVal < 0)|| (MaxVal > 255)) {
             int k = 255/(MaxVal-MinVal);
            for (int i=0; i < pix.length; i++) pix[i]=(pix[i]-MinVal)*k;
      };
       for (int i=0; i < pix.length; i++) {
            red=pix[i];
            green=pix[i];
            blue=pix[i];
            pix[i]=(green<<24)|(red<<16)|blue;
       }
       img = createImage(new MemoryImageSource(col, row, pix, 0, col));
       fileImmagine.close();
     }
     catch(Exception e){}; //--->gestire l'eccezione
     } //end costruttore
  public void paintComponent(Graphics g)
     {
      super.paintComponent(g);
      g.drawImage(img,10,10,this);
     }
     private Image img;
     private int stored=0,allocated=0,high=0,sign=0;
     private int row=0,col=0;
     private int samplesPerPixel,smallPix,highPix;
     private long windowCenter,windowWidth;
     private static String path="c:"+"\\"+"FileImmagine";
 }//end class ImmaginePanel
 class ImmagineFrame extends JFrame
 {public ImmagineFrame()
     {setTitle("Prova Lettura");
     setSize(300,400);
     addWindowListener(new WindowAdapter()
         {public void windowClosing(WindowEvent e)
      {System.exit(0);
      }
         });
     Container contentPane=getContentPane();
     contentPane.add(new ImmaginePanel());
     }
 }
 public class Immagine
 {public static void main(String[] args)
     {JFrame frame= new ImmagineFrame();
     frame.show();
     }
 }
C'e' qualcuno che mi sa dire dove sbaglio?
Grazie in anticipo
    Serena

Chiedo scusa, nel messaggio precedente c'era un problema di copia e
incolla!!
Il mio problema e' la visualizzazione di un'immagine a partire da una
matrice di livelli di grigio.
Se uso lo stesso valore per le componenti RGB, mettendo alpha opaco
(FF), vedo tutto nero (?!): come posso fare per visualizzare l'immagine?
Ecco il codice:
import java.io.*;
import java.awt.*;
import java.awt.image.*;
import java.awt.event.*;
import javax.swing.*;
class ImmaginePanel extends JPanel
{public ImmaginePanel()
    {int[] b= new int[2];
    int red=0, green=0, blue=0;
    int MaxVal=0, MinVal=65536;
 
    //  definiz. immagine
    int[] pix;
 
    //definizione di un file di input
    RandomAccessFile fileImmagine;
    try {
	fileImmagine= new RandomAccessFile(path,"r");
	pix = new int[row*col];
	for (int i=0; i < pix.length; i++) {
	   try {
    	        for (int j=0;j<2;j++) 
		b[j] = fileImmagine.readUnsignedByte();
	   } catch(IOException o){};  //--->  gestione eccezione!!
	   for (int j=0;j<2;j++) {
	        pix[i]<<=8;
		pix[i]+=b[1-j];//valori in Little Endian
	   }
	   if (pix[i]>MaxVal)MaxVal = pix[i];
	   if (pix[i]<MinVal)MinVal = pix[i];
	}
	    if ((MinVal < 0)|| (MaxVal > 255)) {
	      int k = 255/(MaxVal-MinVal);
	      for (int i=0; i < pix.length; i++) 
		    pix[i]=(pix[i]-MinVal)*k;
	    };
	    for (int i=0; i < pix.length; i++) {
		red=pix[i];
		green=pix[i];
		blue=pix[i];
		pix[i]=(green<<16)|(red<<8)|blue|0xFF000000;
	    }
	    img = createImage(new MemoryImageSource(col, row, pix, 0, col));
	fileImmagine.close();
    } catch(Exception e){}; //--->gestire l'eccezione
    } //end costruttore
    public void paintComponent(Graphics g)
    {		
	super.paintComponent(g);
	g.drawImage(img,10,10,this);
    }
    Image img;
    private int row=0,col=0;
 
    private static String path="c:"+"\\"+"Immagine";
}//end class ImmaginePanel
class ImmagineFrame extends JFrame
{public ImmagineFrame()
    {setTitle("Prova");
    setSize(300,400);
    addWindowListener(new WindowAdapter()
		      {public void windowClosing(WindowEvent e)
			  {System.exit(0);
			  }
		      });
    Container contentPane=getContentPane();
    contentPane.add(new ImmaginePanel());
    }
}
public class Immagine
{public static void main(String[] args)
    {JFrame frame= new ImmagineFrame();
    frame.show();
    }
}
dove sbaglio?
Un grazie a chi vorra' aiutarmi...
	Sere

sbaglio ma non riesco a visualizzare niente
Avrei voluto aiutarti, ma nel codice che hai inviato c'e' un "do" che
non corrisponde a nessun "while". Tu riesci a compilarlo?
Ciao.     Leonardo Boselli   
bos...@uno.it
   and
--   o    TETRACTYS Software 
tetr...@uno.it
 present
    o o   JOB - Java Objects Builder (0.9.4-05/17/99)
   o o o  Try it, it's FREE! <134 KB> <Java 2 needed>
  o o o o 
http://www.uno.it/utenti/tetractys/job.html

         Sere
Spero di avere azzeccato l'errore...
Andrea

 meno che non ho letto male!


>
Hai provato, solo per vedere effettivamente cosa e' memorizzato in pix[], a
stampare il contenuto delle singole celle? Magari c'e' qualche errore in partenza!
Purtroppo il campo delle immagini in Java non e' il mio campo... quindi non credo
di poterti aiutare ulteriormente...
in bbocca al lupo
Andrea

matrice di livelli di grigio.
Il problema e' in questo punto:
if((MinVal < 0)|| (MaxVal > 255)) {
  int k = 255/(MaxVal-MinVal);
  for(int i=0; i < pix.length; i++) pix[i]=(pix[i]-MinVal)*k;
};
Nei calcoli precedenti ottieni valori di MaxVal e MinVal cosi' grandi
(la differenza e' dell'ordine di 10000) che il risultato della
divisione e' zero, Dato che k e' un int.
Soluzione: nel ciclo scrivi
pix[i]=(pix[i]-MinVal)*255/(MaxVal-MinVal);
(cioe' elimina la variabile k).
