Newsgroup: it.comp.java
Titolo: Caricare un BMP

    Salve ragazzi, ho trovato quessto codice per caricare delle immagini in
formato BMP (che per le elaborazioni che sto facendo è molto più affidabile
del JPG), qualcuno di voi mi sa dire che cosa mi restituisce? Come fare a
"cavarne" fuori un image?
    Oppure conoscete dei metodi migliori?
    Se qualcuno di voi ha la pazienza di rispondermi gliene sarei amico
Lele
import java.applet.*;
import java.awt.image.*;  // Serve per l'elaborazione dell'immagini
import java.awt.MediaTracker;
import java.awt.Event;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.*;        // Serve per l'oggetto Image
import java.awt.event.*;
import java.awt.Font;
import java.io.*;         // Serve per gli stream
public class CaricaBMP  {
 protected static int sistemaShort(int i) {
  return ((i>>8) & 0xff)+ ((i<<8)& 0xff00);
 }
 protected static int sistemaInt(int i) {
  return ((i & 0xff)<<24)+
  ((i&0xff00)<<8)+
  ((i&0xff0000)>>8)+
  ((i>>24)& 0xff);
 }
 // Costanti relative ai modi in cui le informazioni sono memorizzate
 public static final int C_RGB =0; // Assenza di compressione
 public static final int C_RLE8=1; // Compressione RLE8
 public static final int C_RLE4=2; // Compressione RLE4
 // Metodo statico che fornisce una Image producer dell'InputStream
 public static ImageProducer getBMPImage (InputStream stream) throws
IOException{
  // Creiamo un DataInputStream in quanto dispone di metodi utili per
  // la lettura dei dati
  DataInputStream in = new DataInputStream(stream);
  // verifico che il formato sia
  // un formato BMP cioè che i primi caratteri siano 'B' e 'M'
  if(in.read()!='B') { // Leggo il 1° Byte
   throw new IOException("Non è un BMP file");
  }
  if(in.read()!='A') { // Leggo il secondo
   throw new IOException("Non è un file BMP");
  }
  // Leggo  i 4 Byte relativi alla lunghezza del file
  int fileSize = sistemaInt(in.readInt());
  // Leggo a vuoto i prossimi 4 byte
  in.readUnsignedShort(); // Primi due byte riservati
  in.readUnsignedShort(); // Secondi due byte riservati
  // Ora mi aspettano i primi 4 byte relativi all'Offset
  int bitmapOffset = sistemaInt(in.readInt());
  // FINE PRIMO BLOCCO
  // Secondo Blocco
  // Leggo la dimensione in Byte di questa regione
  int bitmapInfoSize= sistemaInt(in.readInt());
  // Leggo le dimensioni dell'immagine che sono contenute
  // in quattro byte ciascuna
  int width = sistemaInt(in.readInt()); // La larghezza
  int height = sistemaInt(in.readInt());// L'altezza
  // Salto i bit relativi al bitplanes
  in.readUnsignedShort();
  // Leggo il numero di bit per pixel
  int bitCount = sistemaShort(in.readUnsignedShort());
  // Leggo il tipo di compressione utilizzato
  int compressionType =sistemaInt(in.readInt());
  // ... numero di Byte nel Bitmap
  int imageSize= sistemaInt(in.readInt());
  // Salto il numero di pixel per metro
  in.readInt();
  in.readInt();
  // Leggo il numero di colori utilizzati
  int colorsUsed=sistemaInt(in.readInt());
  // ... numero di colori che devono essere tenuti in caso di
  // diminuzione di definizione
  int colorsImportant=sistemaInt(in.readInt());
  // Controllo che il numero di colori utilizzati non sia specificato
  // calcolo il numero di bit per pixel.Questo lo si ottiene
  // moltiplicando per due tante volte quane sono i pixel
  if (colorsUsed==0) colorsUsed=1 << bitCount;
  // In base al numero di colori creo la tabella degli stessi
  // Questa la mettio in un vettore di dimensioni pari al numero
  // dei colori stessi
  int colorTable[] = new int[colorsUsed];
  // Leggo la tabela dei colori.
  for (int i=0;i<colorsUsed;i++) {
    colorTable[i]=(sistemaInt(in.readInt())&0xffffff)+0xff000000;
  }
  // creo il vettore del pixel che conterrà l'immagine.
  int pixels[] = new int[width*height];
  // In base al tipo di compressione utilizzata leggiamo il valore
  // corrispondente
  if (compressionType==C_RGB) {  // Vale a dire 0(non c'è compressione)
    if (bitCount==24) {
     // Se l'iimagine è a 24 bit
     // Utilizzo il metodo ..
     leggiRGB24(width,height,pixels,in);
    }
    else {
     // Altrimenti utilizzo il leggiRGB
     leggiRGB(width,height,colorTable,bitCount,pixels,in);
    }
  }
  // Seil metodo di compressione è diverso utilizzo
  // un metodo opportuno
  else if (compressionType==C_RLE8){
    leggiRLE(width,height,colorTable,bitCount,
    pixels,in,imageSize,8);
  }
  else if (compressionType==C_RLE4){
    leggiRLE(width,height,colorTable,bitCount,
    pixels,in,imageSize,4);
  }
  // Una volta creato il vettore dei pixels e conosciute
  // le dimensioni creo l'image producer attraverso il
  // MemoryImageSource e lo ritorno come risultato
  return new MemoryImageSource(width,height,pixels,0,width);
  }
  // il "24 bit" non ha tabella dei colori e ciascun pixels è
  // rappresentato da una tabella di 3 byte
  protected static void leggiRGB24(int width,int height,int pixels[],
  DataInputStream in)
  throws IOException {
   for (int h=height-1;h>=0;h--) {
    int pos=h*width;
    for (int w=0;w<=width;w++) {
     // Leggo i byte relativi ale varie componenti
     int red =in.read();
     int green=in.read();
     int blue=in.read();
     pixels[pos++]=0xff000000+(red<<16)+(green<<8)+blue;
    }
   }
  }
  protected static void leggiRGB(int width,int height,int colorTable[],
  int bitCount,int pixels[],DataInputStream in)
  throws IOException {
   int pixelsPerByte=8/bitCount;
   int bitMask=(1<<bitCount)-1;
   int bitShifts[]=new int[pixelsPerByte];
   for (int i=0;i<pixelsPerByte;i++) {
    bitShifts[i]=8-((i+1)*bitCount);
   }
   int whichBit=0;
   int currByte=in.read();
   for (int h=height-1;h>=0;h--) {
    int pos=h*width;
    for (int w=0;w<width;w++) {
     pixels[pos]=colorTable[
     (currByte>>bitShifts[whichBit])&bitMask];
     whichBit++;
     if (whichBit>=pixelsPerByte) {
      whichBit=0;
      currByte=in.read();
     }
    }
   }
  }
  // Leggo in corrispondenza del metodo di compressione utilizzato
  protected static void leggiRLE(int width,int height,int colorTable[],
  int bitCount, int pixels[],DataInputStream in,
  int imageSize,int pixelSize)
  throws IOException {
  int x=0;
  int y=height-1;
  for (int i=0;i<imageSize;i++) {
   int byte1=in.read();
   int byte2=in.read();
   i+=2;
   if(byte1==0) {
    if (byte2==0) {
      x=0;
      y--;
    }
    else if(byte2==1) return;
    else if(byte2==2) {
      int xoff=(char)sistemaShort(in.readUnsignedShort());
      i+=2;
      int yoff=(char)sistemaShort(in.readUnsignedShort());
      i+=2;
      x+=xoff;
      y-=yoff;
    } else {
     int whichBit=0;
     int currByte=in.read();
     i++;
     for (int j=0;j<byte2;j++) {
      if(pixelSize==4) {
       if(whichBit==0) {
         pixels[y*width+x]=colorTable[(currByte>>4)
         &0xf];
       } else {
         pixels[y*width+x]=colorTable[currByte &0xf];
         currByte=in.read();
         i++;
       }
      } else {
       pixels[y*width+x]=colorTable[currByte];
       currByte=in.read();
       i++;
      }
      x++;
      if (x>=width) {
        x=0;
        y--;
      }
     }
     if((byte2 &1)==1) {
      in.read();
      i++;
     }
    }
   }else {
    for(int j=0;j<byte1;j++) {
     if (pixelSize==4) {
       if ((j&1)==0) {
        pixels[y*width+x]=colorTable[(byte2>>4)& 0xf];
       }
       else {
        pixels[y*width+x+1]=colorTable[byte2 & 0xf];
       }
     }
     else {
       pixels[y*width+x+1]=colorTable[byte2];
     }
     x++;
     if (x>=width) {
       x=0;
       y--;
     }
    }
   }
  }
 }
 public static void main (String args[]) {
 }
}









    Se qualcuno di voi ha la pazienza di rispondermi gliene sarei amico
ti restituisce un ImageProducer, devi usarlo cosi' :
Image i = new Image(CaricaBMP.getBMPImage(new FileInputStream("immagine.bmp")));
adesso che hai postato questo codice posso finire la mia classe per caricare bitmap
che bello, che bello ;)
nota: non rispedire 8 volte lo stesso messaggio
ciao_O
 
http://digilander.iol.it/schiele

prima di tutto grazie, e poi scusa (ma non l'ho fatto a psota)
Sono contento di esseriti stato utile(quetso codice e di un tal massimo
Carli)
Lele




ho dimenticato di dire che se ti interessa accedere al buffer
interno allora devi usare un PixelGrabber (o come si chiama)
ciao_O
http://digilander.iol.it/schiele

 wrote:

ho dimenticato di dire che se ti interessa accedere al buffer


 wrote in message
3a9ed634...@news.tiscalinet.it...


compilazione ogni volta che provo a dutilizzarlo....
ehm...
a dir la verita' prima di risponderti non ho provato il programma,
ho dato per scontato che funzionasse...
adesso l'ho provato, riesco a compilarlo ma non funziona 
queste righe sono sbagliate
  if(in.read()!='B') { // Leggo il 1° Byte
   throw new IOException("Non č un BMP file");
  }
  if(in.read()!='A') { // Leggo il secondo
   throw new IOException("Non č un file BMP");
  }
il test viene eseguito sugli indirizzi (credo)!
togliendo queste righe (lasciando pero' i due read)
ottengo un out of memory
in conclusione mi chiedo se ste codice abbia mai funzionato...
ciao_O
http://digilander.iol.it/schiele