PLE:Unidad6Ejercicio19

/* Programa:        Unidad6Ejercicio19.cpp Descripción:     Modifica un fichero BMP. using namespace std;
 * 1) include
 * 2) include
 * 3) include
 * 1) include

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 volteaV(pixel *img, pixel *img2, unsigned int w, unsigned int h); void volteaH(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; case 'v':      volteaV(imagen,imagen2,pBMP.width, pBMP.height); break; case 'h':      volteaH(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 << "v - Voltea Verticalmente la imagen" << endl; cout << "h - Voltea Horizontalmente 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)); if(p.imagesize == 0) // La imagen esta comprimida p.imagesize = p.width * p.height * p.bits / 8; }

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)); }

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

void escribePropiedades(ofstream &f, propiedadesBMP &p) {       f.write(reinterpret_cast<char*>(&p.size), sizeof(p.size)); f.write(reinterpret_cast<char*>(&p.width), sizeof(p.width)); f.write(reinterpret_cast<char*>(&p.height), sizeof(p.height)); f.write(reinterpret_cast<char*>(&p.planes), sizeof(p.planes)); f.write(reinterpret_cast<char*>(&p.bits), sizeof(p.bits)); f.write(reinterpret_cast<char*>(&p.compression), sizeof(p.compression)); f.write(reinterpret_cast<char*>(&p.imagesize), sizeof(p.imagesize)); f.write(reinterpret_cast<char*>(&p.xresolution), sizeof(p.xresolution)); f.write(reinterpret_cast<char*>(&p.yresolution), sizeof(p.yresolution)); f.write(reinterpret_cast<char*>(&p.ncolours), sizeof(p.ncolours)); f.write(reinterpret_cast<char*>(&p.importantcolours), sizeof(p.importantcolours)); }

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

void transformaBN(pixel *img, pixel *img2, unsigned int w, unsigned int h) { unsigned int i, j;       float colorR, colorG, colorB, colorBN; for(i = 0; i < h; i++) {               for(j = 0; j < w; j++) {                       colorR = img[i * w + j].byteR; colorG = img[i * w + j].byteG; colorB = img[i * w + j].byteB; colorBN = 0.299 * colorR + 0.587 * colorG + 0.114 * colorB; img2[i * w + j].byteR = colorBN; img2[i * w + j].byteG = colorBN; img2[i * w + j].byteB = colorBN; }       } }

void satura(pixel *img, pixel *img2, unsigned int w, unsigned int h) { unsigned int i, j;       unsigned char umbral = 128; float colorR, colorG, colorB; for(i = 0; i < h; i++) {               for(j = 0; j < w; j++) {                       // Saturamos el rojo if(img[i * w + j].byteR > umbral) img2[i * w + j].byteR = 255; else img2[i * w + j].byteR = 0;

// Saturamos el Verde if(img[i * w + j].byteG > umbral) img2[i * w + j].byteG = 255; else img2[i * w + j].byteG = 0;

// Saturamos el Azul if(img[i * w + j].byteB > umbral) img2[i * w + j].byteB = 255; else img2[i * w + j].byteB = 0; }       } }

void volteaV(pixel *img, pixel *img2, unsigned int w, unsigned int h) { unsigned int i, j, j2; for(i = 0; i < h; i++) {               for(j = 0, j2= w - 1; j < w; j++, j2--) {                       img2[i * w + j] = img[i * w + j2]; }       } }

void volteaH(pixel *img, pixel *img2, unsigned int w, unsigned int h) { unsigned int i, i2, j;       for(i = 0, i2 = h - 1; i < h; i++, i2--) {               for(j = 0; j < w; j++) {                       img2[i * w + j] = img[i2 * w + j]; }       } }