Fandom

Scratchpad

PLE:Unidad7Ejercicio13

219,298pages on
this wiki
Add New Page
Discuss this page0 Share
/*
Programa:         Unidad7jercicio13cpp
Fecha:            27/02/2007
Descripción:      Ficheros BMP. Lee la información de la cabecera y la muestra  en pantalla.


         Estructura de un bmp
         _______________________________________________________
        |                                                       |
        |Cabecera 14 bytes                                      |
        |Propiedades de la imagen (40 bytes)                    |
        |Paleta de color (opcional – su tamaño puede variar)    |
        |Datos de la imagen                                     |
        |_______________________________________________________|


        Cabecera
        ========
        Campo           bytes   Descripción
        Signature       2       Siempre es ‘BM’
        FileSize        4       Tamaño del fichero
        Reserved        4       No se usa
        DataOffset      4       Posición relativa del comienzo de los datos de imagen


        Propiedades de la imagen
        ========================
        Campo           bytes   Descripción
        Size            4       Tamaño de esta sección (siempre es 40 bytes)
        Width           4       Anchura de la imagen en pixels
        Height          4       Altura de la imagen en pixels
        Planes          2       Número de planos (siempre es 1)
        BitCount        2       Bits por píxel (1, 4, 8, 16, 24)
        Compression     4       Tipo de compresión empleado (0, 1, 2)
        ImageSize       4       Tamaño de la imagen comprimida (=0 si no se comprime)
        XPixelsPerM     4       Resolución horizontal: píxeles por metro
        YPixelsPerM     4       Resolución vertical: píxeles por metro
        ColorsUsed      4       Número de colores usados, si hay paleta.
        ColorsImportant 4       Número de colores importantes (=0 si son todos)
*/

#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;


struct cabeceraBMP {
        char Signature[2];              /* Signatura = "BM"             */
        unsigned int FileSize;          /* Tamaño Fichero               */
        unsigned int Reserved;          /* Reservado                    */
        unsigned int DataOffset;        /* Desplazamiento de los datos  */
};

struct propiedadesBMP {
        unsigned int size;               /* Header size in bytes      */
        int width, height;               /* Width and height of image */
        unsigned short int planes;       /* Number of colour planes   */
        unsigned short int bits;         /* Bits per pixel            */
        unsigned int compression;        /* Compression type          */
        unsigned int imagesize;          /* Image size in bytes       */
        int xresolution, yresolution;    /* Pixels per meter          */
        unsigned int ncolours;           /* Number of colours         */
        unsigned int importantcolours;   /* Important colours         */
};

void leeCabecera(ifstream &f, cabeceraBMP &c);
void leePropiedades(ifstream &f, propiedadesBMP &p);
void muestraDatosBMP(cabeceraBMP cBMP, propiedadesBMP pBMP);

void main() {
        cabeceraBMP cBMP;
        propiedadesBMP pBMP;
        char nombre[80];
        ifstream fe;

        cout << "Introduzca nombre del archivo ";
        cin >> nombre;

        fe.open(nombre, ios::in | ios::binary);

        if(fe.good())
        {
                leeCabecera(fe,cBMP);
                leePropiedades(fe,pBMP);
                muestraDatosBMP(cBMP, pBMP);
                fe.close();
        }
        else
                cout << "Error: El fichero no existe ";
        cin.ignore();
        cin.get();
}

void leeCabecera(ifstream &f, cabeceraBMP &c)
{
        f.read(reinterpret_cast<char*>(&c.Signature[0]), sizeof(c.Signature[0]));
        f.read(reinterpret_cast<char*>(&c.Signature[1]), sizeof(c.Signature[1]));
        f.read(reinterpret_cast<char*>(&c.FileSize), sizeof(c.FileSize));
        f.read(reinterpret_cast<char*>(&c.Reserved), sizeof(c.Reserved));
        f.read(reinterpret_cast<char*>(&c.DataOffset), sizeof(c.DataOffset));
}

void leePropiedades(ifstream &f, propiedadesBMP &p)
{
        f.read(reinterpret_cast<char*>(&p.size), sizeof(p.size));
        f.read(reinterpret_cast<char*>(&p.width), sizeof(p.width));
        f.read(reinterpret_cast<char*>(&p.height), sizeof(p.height));
        f.read(reinterpret_cast<char*>(&p.planes), sizeof(p.planes));
        f.read(reinterpret_cast<char*>(&p.bits), sizeof(p.bits));
        f.read(reinterpret_cast<char*>(&p.compression), sizeof(p.compression));
        f.read(reinterpret_cast<char*>(&p.imagesize), sizeof(p.imagesize));
        f.read(reinterpret_cast<char*>(&p.xresolution), sizeof(p.xresolution));
        f.read(reinterpret_cast<char*>(&p.yresolution), sizeof(p.yresolution));
        f.read(reinterpret_cast<char*>(&p.ncolours), sizeof(p.ncolours));
        f.read(reinterpret_cast<char*>(&p.importantcolours), sizeof(p.importantcolours));
        if(p.imagesize == 0) // La imagen esta comprimida
                p.imagesize = p.width * p.height * p.bits / 8;
}

void muestraDatosBMP(cabeceraBMP cBMP, propiedadesBMP pBMP)
{
        cout << "Cabecera BMP " << endl << endl;
        cout << "Sgnatura = " << cBMP.Signature[0] << cBMP.Signature[1] << endl;
        cout << "Tam.Fichero = " << cBMP.FileSize << endl;
        cout << "Reservado = " << cBMP.Reserved << endl;
        cout << "Deplz. datos = " << cBMP.DataOffset << endl << endl;

        cout << "Propiedades BMP " << endl << endl;
        cout << "Tam. = " << pBMP.size << endl;
        cout << "Ancho = " << pBMP.width << endl;
        cout << "Alto = " << pBMP.height << endl;
        cout << "Planos = " << pBMP.planes << endl;
        cout << "Bits = " << pBMP.bits << endl;
        cout << "Compresion = " << pBMP.compression << endl;
        cout << "Tam. Imagen = " << pBMP.imagesize << endl;
        cout << "Resolucion X = " << pBMP.xresolution << endl;
        cout << "Resolucion Y = " << pBMP.yresolution << endl;
        cout << "Num. Colores = " << pBMP.ncolours << endl;
        cout << "Num. Col. Import. = " << pBMP.importantcolours << endl;
}

Ad blocker interference detected!


Wikia is a free-to-use site that makes money from advertising. We have a modified experience for viewers using ad blockers

Wikia is not accessible if you’ve made further modifications. Remove the custom ad blocker rule(s) and the page will load as expected.

Also on Fandom

Random wikia