Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Gráficos (https://www.clubdelphi.com/foros/forumdisplay.php?f=8)
-   -   Leer cabecera de imagen bmp (https://www.clubdelphi.com/foros/showthread.php?t=86771)

ErYcK 30-09-2014 13:10:01

Leer cabecera de imagen bmp
 
No estoy seguro de si este es el lugar correcto de este post, pero no sabia muy bien donde ubicarlo y si podriais ayudarme, siempre e trabajado con c++ Builder, pero ahora me ha tocado implicarme a programación a bajo nivel, tengo que crear mis propias librerias, y estoy teniendo problemas con algo aparentemente simple, mi idea es intentar leer una imagen BMP, por cierto trabajo con codelite en linux.

El proelbma es que al intentar leer la cabecera del archivo BMP lo que he encontrado por ahi es que deberia leer los dos bytes de identificación en los cuales deberia encontrar si es cierto que es un BMP "BM" que seria equivalente a 0x4D42 pero al parecer lo que me lee es un numero, que no se realmente que logica tiene, para entender que eso es un archivo BMP, supongon que deberia entender mejor como funciona este formato, pero no consigo entender como se debe de leer.

Si pueden darme alguna idea o pista seria de gran ayuda.

Gracias de antemano, un Saludo!

ecfisa 30-09-2014 19:30:50

Hola ErYcK.

Verificar si el archivo es un Bitmap:
Código PHP:

bool IsBMPFile(char *filename) {
  
unsigned char buf[2];

  
TFileStream *fs = new TFileStream(filenamefmOpenRead);
  
fs->Read(bufsizeof(buf));
  
fs->Free();
  return 
buf[0]==0x42 && buf[1]==0x4D;
}

/* Llamada de ejemplo */
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  if (
IsBMPFile("Imagen.bmp")) 
    
ShowMessage("Es un archivo Bitmap");


Leer información de la cabecera:
Código PHP:

void GetBmpNfo(char *filenameTStrings *nfo) {
  
TFileStream *Stream = new TFileStream(filenamefmOpenRead);
  
unsigned char buf[2];
  
TBitmapFileHeader fh;
  
TBitmapInfoHeader ih;

  
nfo->Clear();
  
Stream->Read(&fhsizeof(fh));
  
buf[0]=fh.bfType&0xFF;
  
buf[1]=fh.bfType>>8&0xFF;
  if (
buf[0]== 0x42 && buf[1]==0x4D) { 
    
nfo->Add("Type               : " IntToHex(fh.bfType&0xFF,2) +
      
IntToHex(fh.bfType>>8&0xFF,2));
    
nfo->Add("File size          : " String(fh.bfSize));
    
nfo->Add("Ofset              : " String(fh.bfOffBits));
    
nfo->Add("Image size         : " String(ih.biSize));
    
nfo->Add("Width              : " String(ih.biWidth));
    
nfo->Add("Height             : " String(ih.biHeight));
    
nfo->Add("Planes             : " String(ih.biPlanes));
    
nfo->Add("Bit count          : " String(ih.biBitCount));
    
nfo->Add("Bit compression    : " String(ih.biCompression));
    
nfo->Add("Bit X per meter    : " String(ih.biXPelsPerMeter));
    
nfo->Add("Bit Y per meter    : " String(ih.biYPelsPerMeter));
    
nfo->Add("Color index table  : " String(ih.biClrUsed));
    
nfo->Add("Color index display: " String(ih.biClrImportant));
  }
  
Stream->Free();
}

/* Llamada de ejemplo */
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  
GetBmpNfo("Imagen.bmp"ListBox1->Items);


Es claro que si tenes definidas las dos funciones es innecesaria la comprobación del tipo de archivo en la segunda, es decir:
Código PHP:

void GetBmpNfo(char *filenameTStrings *nfo) {
  
TFileStream *Stream = new TFileStream(filenamefmOpenRead);
  
TBitmapFileHeader fh;
  
TBitmapInfoHeader ih;

  
nfo->Clear();
  
Stream->Read(&fhsizeof(fh));
  
nfo->Add("Type               : " IntToHex(fh.bfType&0xFF,2) +
    
IntToHex(fh.bfType>>8&0xFF,2));
  
nfo->Add("File size          : " String(fh.bfSize));
  
nfo->Add("Ofset              : " String(fh.bfOffBits));
  
nfo->Add("Image size         : " String(ih.biSize));
  
nfo->Add("Width              : " String(ih.biWidth));
  
nfo->Add("Height             : " String(ih.biHeight));
  
nfo->Add("Planes             : " String(ih.biPlanes));
  
nfo->Add("Bit count          : " String(ih.biBitCount));
  
nfo->Add("Bit compression    : " String(ih.biCompression));
  
nfo->Add("Bit X per meter    : " String(ih.biXPelsPerMeter));
  
nfo->Add("Bit Y per meter    : " String(ih.biYPelsPerMeter));
  
nfo->Add("Color index table  : " String(ih.biClrUsed));
  
nfo->Add("Color index display: " String(ih.biClrImportant));
  
Stream->Free();
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  
char *fname"Imagen.bmp";
  if (
IsBMPFile(fname))
    
GetBmpNfo(fnameListBox1->Items);


Saludos :)

ecfisa 30-09-2014 20:07:50

Hola de nuevo.

Te pido disculpas :o, releyendo veo que pasé por alto este comentario de tu mensaje:
Cita:

... por cierto trabajo con codelite en linux .
Saludos :)

ErYcK 01-10-2014 09:09:51

No te preocupes, seguro que me sera de ayuda, podre pasarlo a c++ y probarlo a ver que tal. en cuanto tenga algo claro comento.

Gracias un saludo


La franja horaria es GMT +2. Ahora son las 06:36:46.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi