Perdón por lo desordenado, pero estoy esperando que funcione para hacerlo con funciones y dejarlo mas corto. En la opción 2 se supone que tendría que copiar la imagen. (Hasta el momento solo funciona con imágenes BMP de 24 bits).
· Los códigos deben ir en etiquetas GeSHi
>aquí las reglas del foro
-Engel Lex
Código (c) [Seleccionar]
#include <stdio.h>
#include <stdlib.h>
typedef struct{
char marc1;
char marc2;
int tamArchivo;
short int reservado1;
short int reservado2;
int finalDatos;
}FILEHEADER;
typedef struct{
unsigned int tamCabecera;
unsigned int ancho;
unsigned int alto;
short int numPlanos;
short int tamPunto;
unsigned int compresion;
unsigned int tamImagen;
unsigned int resoHoriz;
unsigned int resoVertic;
unsigned int tamTablaColor;
unsigned int contColorImport;
}INFOHEADER;
typedef struct {
unsigned char azul;
unsigned char rojo;
unsigned char verde;
}PIXEL;
int main ()
{
int opcion;
printf ("\t\tESTEGANOGRAFIA\n\n");
printf ("Menu: \n\n");
printf ("1. Calcular capacidad total de imagen.\n");
printf ("2. Esteganografiar.\n");
printf ("3. Decodificar.\n");
printf ("4. Salir.");
printf("\n\nIngrese una opcion: ");
scanf ("%d", &opcion);
FILEHEADER fh;
INFOHEADER ih;
PIXEL pix;
FILE *fp;
FILE *fp2;
char archivo[30];
int i,j;
if(opcion==1){
printf("\nIngrese nombre del archivo: ");
fflush(stdin);
scanf("%s", archivo);
fp = fopen(archivo,"rb");
while(fp==NULL){
printf("\nEl archivo no ha sido encontrado.\n");
fflush(stdin);
printf("\nIngrese nombre del archivo: ");
scanf("%s", archivo);
fp = fopen(archivo,"rb");
}
fseek(fp,0,SEEK_SET);
unsigned char marc1 = fread(&fh.marc1, 1, sizeof(FILEHEADER), fp);
fseek(fp, 1, SEEK_SET);
unsigned char marc2 = fread(&fh.marc2, 1, sizeof(FILEHEADER), fp);
fseek(fp, 14, SEEK_SET);
unsigned int tamCabecera = fread(&ih.tamCabecera, 4, 1, fp);
fseek(fp, 18, SEEK_SET);
unsigned int ancho = fread(&ih.ancho, 4, 1, fp);
fseek(fp, 22, SEEK_SET);
unsigned int alto = fread(&ih.alto, 4, 1, fp);
fseek(fp, 28, SEEK_SET);
short int tamPunto = fread(&ih.tamPunto, 2, 1, fp);
if(fh.marc1=='B' && fh.marc2=='M' && ih.tamCabecera==40){
if(ih.tamPunto==24){ //INICIO CALCULO CAPACIDAD
unsigned long long totBytes=(ih.ancho*ih.alto)*3;
printf("Capacidad total: %llu bytes\n", totBytes);
}
if(ih.tamPunto==16){
unsigned long long totBytes=(ih.ancho*ih.alto)*2;
printf("Capacidad total: %llu bytes\n", totBytes);
}
if(ih.tamPunto==32){
int totBytes=(ih.ancho*ih.alto);
printf("Capacidad total: %d bytes\n", totBytes)*4;
} //FIN CALCULO CAPACIDAD
}
else{
while(fh.marc1!='B' || fh.marc2!='M' || ih.tamCabecera!=40){
printf ("\nImagen no valida.\n");
printf("\nIngrese nombre del archivo: ");
scanf("%s", archivo);
fp = fopen(archivo,"rb");
while(fp==NULL){
printf("\nEl archivo no ha sido encontrado.\n");
fflush(stdin);
printf("\nIngrese nombre del archivo: ");
scanf("%s", archivo);
fp = fopen(archivo,"rb");
}
fseek(fp,0,SEEK_SET);
unsigned char marc1 = fread(&fh.marc1, 1, sizeof(FILEHEADER), fp);
fseek(fp, 1, SEEK_SET);
unsigned char marc2 = fread(&fh.marc2, 1, sizeof(FILEHEADER), fp);
fseek(fp, 14, SEEK_SET);
unsigned int tamCabecera = fread(&ih.tamCabecera, 4, 1, fp);
fseek(fp, 18, SEEK_SET);
unsigned int ancho = fread(&ih.ancho, 4, 1, fp);
fseek(fp, 22, SEEK_SET);
unsigned int alto = fread(&ih.alto, 4, 1, fp);
fseek(fp, 28, SEEK_SET);
short int tamPunto = fread(&ih.tamPunto, 2, 1, fp);
}
if(ih.tamPunto==24){ //INICIO CALCULO CAPACIDAD
unsigned long long totBytes=(ih.ancho*ih.alto)*3;
printf("Capacidad total: %llu bytes\n", totBytes);
}
if(ih.tamPunto==16){
unsigned long long totBytes=(ih.ancho*ih.alto)*2;
printf("Capacidad total: %llu bytes\n", totBytes);
}
if(ih.tamPunto==32){
int totBytes=(ih.ancho*ih.alto)*4;
printf("Capacidad total: %d bytes\n", totBytes);
} //FIN CALCULO CAPACIDAD
}
}
if(opcion==2){
printf("\nIngrese nombre del archivo: ");
fflush(stdin);
scanf("%s", archivo);
fp = fopen(archivo, "rb");
fp2 = fopen("aux.bmp", "w+");
while(fp==NULL){
printf("\nEl archivo no ha sido encontrado.\n");
fflush(stdin);
printf("\nIngrese nombre del archivo: ");
scanf("%s", archivo);
fp = fopen(archivo,"rb");
fp2 = fopen("aux.bmp", "w+");
}
fseek(fp,0,SEEK_SET);
fread(&fh, sizeof(unsigned char), 14, fp);
fseek(fp,14,SEEK_SET);
fread(&ih,sizeof(unsigned char), 40,fp);
unsigned int valor[ih.ancho][ih.alto];
fseek(fp2, 0, SEEK_SET);
fwrite(&fh, sizeof(unsigned char), 14, fp2); //TENER FWRITE AQUI HACE QUE CREE AUX AUNQUE SEA UN ARCHIVO INVALIDO O NO EXISTA
fseek(fp2, 14, SEEK_SET);
fwrite(&ih, sizeof(unsigned int), 40, fp2);
if(fh.marc1=='B' && fh.marc2=='M' && ih.tamCabecera==40){
if(ih.tamPunto==24){
unsigned long long totBytes=(ih.ancho*ih.alto)*3;
for(i=0; i<ih.alto; i++){
for(j=0; j<ih.ancho; j++){
fseek(fp, (fh.finalDatos+3*(j+ih.ancho*i)), SEEK_SET);
fread(&pix, sizeof(char), sizeof(PIXEL), fp);
fseek(fp2, (fh.finalDatos+3*(j+ih.ancho*i)), SEEK_SET);
fwrite(&pix, sizeof(char), sizeof(PIXEL), fp2);
}
}
}
if(ih.tamPunto==16){
unsigned long long totBytes=(ih.ancho*ih.alto)*2;
}
if(ih.tamPunto==32){
int totBytes=(ih.ancho*ih.alto)*4;
} //FIN CALCULO CAPACIDAD
}
else{
while(fh.marc1!='B' || fh.marc2!='M' || ih.tamCabecera!=40){
printf ("\nImagen no valida.\n");
printf("\nIngrese nombre del archivo: ");
scanf("%s", archivo);
fp = fopen(archivo,"rb");
fp2 = fopen("aux.bmp", "w+");
while(fp==NULL){
printf("\nEl archivo no ha sido encontrado.\n");
fflush(stdin);
printf("\nIngrese nombre del archivo: ");
scanf("%s", archivo);
fp = fopen(archivo,"rb");
fp2 = fopen("aux.bmp", "w+");
}
fseek(fp,0,SEEK_SET);
fread(&fh, sizeof(unsigned char), 14, fp);
fseek(fp,14,SEEK_SET);
fread(&ih,sizeof(unsigned char), 40,fp);
unsigned int valor[ih.ancho][ih.alto];
fseek(fp2, 0, SEEK_SET);
fwrite(&fh, sizeof(unsigned char), 14, fp2);
fseek(fp2, 14, SEEK_SET);
fwrite(&ih, sizeof(unsigned int), 40, fp2);
if(ih.tamPunto==24){
unsigned long long totBytes=(ih.ancho*ih.alto)*3;
for(i=0; i<ih.ancho; i++){
for(j=0; j<ih.alto; j++){
fseek(fp, (fh.finalDatos+3*(j+ih.ancho*i)), SEEK_SET);
fread(&pix, sizeof(char), sizeof(PIXEL), fp);
fseek(fp2, (fh.finalDatos+3*(j+ih.ancho*i)), SEEK_SET);
fwrite(&pix, sizeof(char), sizeof(PIXEL), fp2);
}
}
}
if(ih.tamPunto==16){
unsigned long long totBytes=(ih.ancho*ih.alto)*2;
}
if(ih.tamPunto==32){
int totBytes=(ih.ancho*ih.alto)*4;
}
}
}
}
return 0;
}
· Los códigos deben ir en etiquetas GeSHi
>aquí las reglas del foro
-Engel Lex