If it can help I use the following procedure wich read only the header of the 
image filename and return a char* representing the type of image


char * typeImage (char * filename)
{
 char * type ;
 type = new char[6];
 strcpy (type,"ANY");
 char header[64];
 FILE * fichier;
 fichier = fopen (filename,"rb");

 if (! fichier) return type;
 fread (header,sizeof (char),64,fichier);
 fclose (fichier);

 if (memcmp(header, "GIF87a", 6) == 0 ||
      memcmp(header, "GIF89a", 6) == 0)
 {

   strcpy (type,"GIF");
 }
   if (memcmp(header, "BM", 2) == 0)    // BMP file
    {

   strcpy (type,"BMP");
 }
 if (header[0] == 'P' && (header[1] == '3' || header[1] == '6'))
   {

   strcpy (type,"PPM");
   }
    if (header[0] == 'P' && (header[1] == '2' || header[1] == '5'))
   {

   strcpy (type,"PGM");
   }

if (header[0] == 'P' && header[1] == '1' )
   {

   strcpy (type,"PBM");
   }

     if (memcmp(header, "\211PNG", 4) == 0)
  {

   strcpy (type,"PNG");
  }
 /*
  if (memcmp(header, "\377\330\377", 3) == 0 &&
      header[3] >= 0xc0 && header[3] <= 0xef)
      */
 if (memcmp(header, "\377\330\377", 3) == 0)
  {

   strcpy (type,"JPEG");
  }
   if (memcmp(header, "II*", 3) == 0||memcmp(header, "MM*", 3) == 0 )
    {

   strcpy (type,"TIFF");
 }
return type;
}


> Hello,
>
> I wonder how i could detect RGB image format, without loading image in a
> buffer, and then parsing its header.
>
> For the moment, i'm doing this in my classe, which is far from being
> efficient:
>
>
> Fl_Image * Images::load (std::string filename)
> {
>    Fl_Image *image = is_image_already_loaded(filename);
>
>    if (!image) {
>      image = new Fl_JPEG_Image (filename.c_str());
>      if (image->w()) {
>        //the image is cached when loading once.
>        liste.insert(std::pair<std::string, Fl_Image *>(filename,image) );
>      } else {
>        delete image;
>        image = 0;
>      }
>    }
>
>    if (!image) {
>      image = new Fl_PNG_Image (filename.c_str());
>      if (image->w()) {
>        liste.insert(std::pair<std::string, Fl_Image *>(filename,image) );
>      } else {
>        delete image;
>        image = 0;
>      }
>    }
>
>    if (!image) {
>      image = new Fl_BMP_Image (filename.c_str());
>      if (image->w()) {
>        liste.insert(std::pair<std::string, Fl_Image *>(filename,image) );
>      } else {
>        CRITICAL ("unknwown format for : %s\n",filename.c_str());
>        delete image;
>        image = 0;
>      }
>    }
>
>    return image;
> }
>
> Of course, i could preload the image in a buffer, and then trying
> Fl_JPEG/PNG/BMP_Image from this buffer.
> I could also use a template for the three almost identical load.
> As i cache the picture once loaded, i think i don't get a big speed
> penalty, even if i load BMP pictures.
>
> Thank you.
> (�premature optimizing is the root of all evil�, i know too :) )
>

_______________________________________________
fltk mailing list
fltk@easysw.com
http://lists.easysw.com/mailman/listinfo/fltk

Reply via email to