BMP CAMBIAR IMAGEN DE 1 BIT A ROJO Y AZUL. AYUDA CON EL COGIDO A PROGRAMAR

#include<stdio.h>
#include<fcntl.h>
#include<stdlib.h>
#include<math.h>


#define TWO_BYTES 2
#define FOUR_BYTES 4

double Pot(double, int);

struct BITMAPFILEHEADER
{
char bfType[2];
int bfSize;
int bfReserved1;
int bfReserved2;
int bfOffbits;

}bmpfileheader;

struct BITMAPINFOHEADER
{
int biSize;
int biWidth;
int biHeight;
int biPlanes;
int biBitCount;
int biCompresion;
int biSizeImage;
int biXPelsPermeter;
int biYPelsPermeter;
int biClrUsed;
int biClrImportant;

}bmpinfoheader;

struct PALETARGB
{
unsigned char RGB[3];
unsigned char q;
unsigned char gris;
}Paleta;


main(int argc, char *argv[])
{
if(argc < 3)
{ perror("\nError: Falta incluir archivo.\n");
exit(1);
}
/****declaracion de variables******/
int bytes_leidos, dao, daf, valor_leido;
char z[TWO_BYTES];
char buffer[256];

////////opn docs////////////////////

dao = open(argv[1],O_RDONLY);
daf = open(argv[2], O_TRUNC | O_WRONLY | O_CREAT, 0666);
bytes_leidos = read(dao, z, TWO_BYTES);

//////check if is BMP//////////////
if(z[0] == 'B' && z[1] == 'M' )
{
//1
printf("\n\t--BMPFILEHEADER--\n");
bmpfileheader.bfType[0] = z[0]; bmpfileheader.bfType[1] = z[1];
write(daf, &bmpfileheader.bfType, sizeof(bmpfileheader.bfType));
printf("\nbfType: %s", bmpfileheader.bfType);
//2
bytes_leidos = read(dao,&valor_leido,FOUR_BYTES);
printf("\nbfSize: %d bytes", valor_leido);
bmpfileheader.bfSize = valor_leido;valor_leido = 0;
write(daf, &bmpfileheader.bfSize, bytes_leidos);
//3
bytes_leidos = read(dao, &valor_leido,TWO_BYTES);
printf("\nbfReserved1: %d", valor_leido);
bmpfileheader.bfReserved1 = valor_leido; valor_leido = 0;
write(daf, &bmpfileheader.bfReserved1, bytes_leidos);
//4
bytes_leidos = read(dao, &valor_leido,TWO_BYTES );
printf("\nbfReserved2: %d", valor_leido);
bmpfileheader.bfReserved2 = valor_leido; valor_leido = 0;
write(daf, &bmpfileheader.bfReserved2, bytes_leidos);
//5
bytes_leidos = read(dao, &valor_leido, FOUR_BYTES);
printf("\nbfOffbits: %d bytes\n", valor_leido);
bmpfileheader.bfOffbits = valor_leido; valor_leido = 0;
write(daf, &bmpfileheader.bfOffbits, bytes_leidos);
/**********fin de BITMAPFILEHEADER************/

/**********comienza BITMAPINFOHEADER***********/
printf("\n\t--BITMAPINFOHEADER--\n\n");
//1
bytes_leidos = read(dao, &valor_leido, FOUR_BYTES);
printf("biSize: %d", valor_leido);
bmpinfoheader.biSize = valor_leido; valor_leido = 0;
write(daf, &bmpinfoheader.biSize, bytes_leidos);
//2
bytes_leidos = read(dao, &valor_leido,FOUR_BYTES);
printf("\nbiWidth: %d pixeles", valor_leido);
bmpinfoheader.biWidth = valor_leido; valor_leido = 0;
write(daf, &bmpinfoheader.biWidth, bytes_leidos);
//3
bytes_leidos = read(dao, &valor_leido,FOUR_BYTES);
printf("\nbiHeight: %d pixeles", valor_leido);
bmpinfoheader.biHeight = valor_leido; valor_leido = 0;
write(daf, &bmpinfoheader.biHeight, bytes_leidos);
//4
bytes_leidos = read(dao, &valor_leido,TWO_BYTES);
printf("\nbiPlanes: %d", valor_leido);
bmpinfoheader.biPlanes = valor_leido; valor_leido = 0;
write(daf, &bmpinfoheader.biPlanes, bytes_leidos);
//5
bytes_leidos = read(dao, &valor_leido,TWO_BYTES);
printf("\nbiBitCount: %d bits", valor_leido );
bmpinfoheader.biBitCount = valor_leido; valor_leido = 0;
write(daf, &bmpinfoheader.biBitCount, bytes_leidos);
//6
bytes_leidos = read(dao, &valor_leido, FOUR_BYTES);
printf("\nbiCompresion: %d", valor_leido);
bmpinfoheader.biCompresion = valor_leido; valor_leido = 0;
write(daf, &bmpinfoheader.biCompresion, bytes_leidos);
//7
bytes_leidos = read(dao, &valor_leido, FOUR_BYTES);
printf("\nbiSizeImage: %d", bytes_leidos);
bmpinfoheader.biSizeImage = valor_leido; valor_leido = 0;
write(daf, &bmpinfoheader.biSizeImage, bytes_leidos);
//8
bytes_leidos = read(dao, &valor_leido, FOUR_BYTES);
printf("\nbiXPelsPermeter: %d pixeles", valor_leido);
bmpinfoheader.biXPelsPermeter = valor_leido;valor_leido = 0;
write(daf, &bmpinfoheader.biXPelsPermeter, bytes_leidos);
//9
bytes_leidos = read(dao, &valor_leido, FOUR_BYTES);
printf("\nbiYPelsPermeter: %d pixeles", valor_leido);
bmpinfoheader.biYPelsPermeter = valor_leido; valor_leido = 0;
write(daf, &bmpinfoheader.biYPelsPermeter, bytes_leidos);
//10
bytes_leidos = read(dao, &valor_leido, FOUR_BYTES);
printf("\nbiClrUsed: %d", valor_leido);
bmpinfoheader.biClrUsed = valor_leido; valor_leido = 0;
write(daf, &bmpinfoheader.biClrUsed, bytes_leidos);
//11
bytes_leidos = read(dao, &valor_leido, FOUR_BYTES);
printf("\nbiClrImportant: %d", valor_leido);
bmpinfoheader.biClrImportant = valor_leido; valor_leido = 0;
write(daf, &bmpinfoheader.biClrImportant, bytes_leidos);
printf("\n\n\t--Paleta de colores a escala de grises--");


/*********PALETA DE COLORES************/
if(bmpinfoheader.biBitCount == 4 || bmpinfoheader.biBitCount == 8 || bmpinfoheader.biBitCount == 1)
{//if
int conta;
for( conta = 0; conta < Pot(2.0, bmpinfoheader.biBitCount); conta++)
{

bytes_leidos = read(dao, &Paleta.RGB[0], 1);
bytes_leidos = read(dao, &Paleta.RGB[1], 1);
bytes_leidos = read(dao, &Paleta.RGB[2], 1);
bytes_leidos = read(dao, &Paleta.q, 1);

Paleta.gris = ( (0.299)*Paleta.RGB[0] + (0.587)*Paleta.RGB[1] + (0.114)*Paleta.RGB[2] +Paleta.q);

write(daf, &Paleta.gris, bytes_leidos);
write(daf, &Paleta.gris, bytes_leidos);
write(daf, &Paleta.gris, bytes_leidos);
write(daf, &Paleta.gris, bytes_leidos);

}//for
printf("\ntermino leer paleta...");


/***** Copiando imagen ******/
printf("\nCopiando imagen...");
bytes_leidos = 0; //unsigned int v;
while((bytes_leidos = read(dao, buffer ,sizeof(buffer))) != 0)
{
write(daf, buffer, bytes_leidos);
}
printf("\nImagen copiada...\n");
}//fin de if
else//
{
printf("escribiendo imagen...");

while((bytes_leidos = read(dao, &Paleta.RGB, sizeof(Paleta.RGB ) )) != 0 )
{

Paleta.gris = ((0.299)*Paleta.RGB[0] + (0.587)*Paleta.RGB[1] + (0.114)*Paleta.RGB[2])/3;
write(daf, &Paleta.gris, 1);
write(daf, &Paleta.gris, 1);
write(daf, &Paleta.gris, 1);
}//fin de while
printf("\nTermino de leer...\n");
printf("\nImagen copiada...\n");

}

}
else
{
printf("\nNo es archivo bmp.\n");
}


printf("\n\n");
close(dao);
close(daf);
}//main

double Pot(double base, int exp)
{
int b = base;
int e = exp;
double val = 1;

if(e == 0)
return val;

for(; e>0; e-- )
val = val*b;

return val;
}
0 (0 Votos)