PLE:Unidad7Ejercicio14

using namespace std;
 * 1) include
 * 2) include
 * 3) include

/*     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)

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         */ };

struct pixel { unsigned char byteR, byteG, byteB; };

void leeCabecera(ifstream &f, cabeceraBMP &c); void leePropiedades(ifstream &f, propiedadesBMP &p); void leeImagen(ifstream &f, pixel *img, unsigned int tam); void transformaBN(pixel *img, pixel *img2, unsigned int w, unsigned int h); void satura(pixel *img, pixel *img2, unsigned int w, unsigned int h); void escribeCabecera(ofstream &f, cabeceraBMP &c); void escribePropiedades(ofstream &f, propiedadesBMP &p); void escribeImagen(ofstream &f, pixel *img, unsigned int tam); char menu;

const char BN = 'b'; const char SATURA = 's';

void main { cabeceraBMP cBMP; propiedadesBMP pBMP; pixel *imagen, *imagen2; unsigned int t;       char nombreOri[80], nombreDes[80], op;

cout << "Introduzca el nombre del fichero origen "; cin >> nombreOri; cout << endl << "Introduzca el nombre del fichero destino "; cin >> nombreDes;

ifstream fe(nombreOri, ios::in | ios::binary); ofstream fs(nombreDes, ios::out | ios::binary);

if(fe.is_open && fs.is_open) {               leeCabecera(fe,cBMP); leePropiedades(fe,pBMP); imagen = new pixel[pBMP.imagesize / 3]; imagen2 = new pixel[pBMP.imagesize / 3]; leeImagen(fe,imagen,pBMP.imagesize / 3);

op = menu; switch(op) {                       case 'b':       transformaBN(imagen,imagen2,pBMP.width, pBMP.height); break; case 's':      satura(imagen,imagen2,pBMP.width, pBMP.height); break; }

escribeCabecera(fs,cBMP); escribePropiedades(fs,pBMP); escribeImagen(fs,imagen2,pBMP.imagesize / 3);

fe.close; fs.close; }       else cout << "Error: El fichero no existe "; cin.get; }

char menu {       char opc; cout << "MENU DE OPCIONES" << endl; cout << "b - Covierte la imagen en banco y negro" << endl; cout << "s - Satura la imagen" << endl; cout << "Elija una opcion: "; cin >> opc; return opc; }

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

void leePropiedades(ifstream &f, propiedadesBMP &p) {       f.read(reinterpret_cast(&p.size), sizeof(p.size)); f.read(reinterpret_cast(&p.width), sizeof(p.width)); f.read(reinterpret_cast(&p.height), sizeof(p.height)); f.read(reinterpret_cast(&p.planes), sizeof(p.planes)); f.read(reinterpret_cast(&p.bits), sizeof(p.bits)); f.read(reinterpret_cast(&p.compression), sizeof(p.compression)); f.read(reinterpret_cast(&p.imagesize), sizeof(p.imagesize)); f.read(reinterpret_cast(&p.xresolution), sizeof(p.xresolution)); f.read(reinterpret_cast(&p.yresolution), sizeof(p.yresolution)); f.read(reinterpret_cast(&p.ncolours), sizeof(p.ncolours)); f.read(reinterpret_cast(&p.importantcolours), sizeof(p.importantcolours)); }

void leeImagen(ifstream &f, pixel *img, unsigned int tam) {       for(unsigned int i = 0; i < tam; i++) f.read(reinterpret_cast<char*>(img + i), sizeof(*img)); }