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).
#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 ("1. Calcular capacidad total de imagen.\n"); printf ("2. Esteganografiar.\n"); printf("\n\nIngrese una 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: "); fp
= fopen(archivo
,"rb");
while(fp==NULL){
printf("\nEl archivo no ha sido encontrado.\n"); printf("\nIngrese nombre del archivo: "); fp
= fopen(archivo
,"rb"); }
unsigned char marc1
= fread(&fh.
marc1, 1, sizeof(FILEHEADER
), fp
); unsigned char marc2
= fread(&fh.
marc2, 1, sizeof(FILEHEADER
), fp
); unsigned int tamCabecera
= fread(&ih.
tamCabecera, 4, 1, fp
); unsigned int ancho
= fread(&ih.
ancho, 4, 1, fp
); unsigned int alto
= fread(&ih.
alto, 4, 1, fp
); 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: "); fp
= fopen(archivo
,"rb");
while(fp==NULL){
printf("\nEl archivo no ha sido encontrado.\n"); printf("\nIngrese nombre del archivo: "); fp
= fopen(archivo
,"rb"); }
unsigned char marc1
= fread(&fh.
marc1, 1, sizeof(FILEHEADER
), fp
); unsigned char marc2
= fread(&fh.
marc2, 1, sizeof(FILEHEADER
), fp
); unsigned int tamCabecera
= fread(&ih.
tamCabecera, 4, 1, fp
); unsigned int ancho
= fread(&ih.
ancho, 4, 1, fp
); unsigned int alto
= fread(&ih.
alto, 4, 1, fp
); 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: "); fp
= fopen(archivo
, "rb"); fp2
= fopen("aux.bmp", "w+");
while(fp==NULL){
printf("\nEl archivo no ha sido encontrado.\n"); printf("\nIngrese nombre del archivo: "); fp
= fopen(archivo
,"rb"); fp2
= fopen("aux.bmp", "w+"); }
fread(&fh
, sizeof(unsigned char), 14, fp
); fread(&ih
,sizeof(unsigned char), 40,fp
); unsigned int valor[ih.ancho][ih.alto];
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: "); fp
= fopen(archivo
,"rb"); fp2
= fopen("aux.bmp", "w+");
while(fp==NULL){
printf("\nEl archivo no ha sido encontrado.\n"); printf("\nIngrese nombre del archivo: "); fp
= fopen(archivo
,"rb"); fp2
= fopen("aux.bmp", "w+"); }
fread(&fh
, sizeof(unsigned char), 14, fp
); fread(&ih
,sizeof(unsigned char), 40,fp
); unsigned int valor[ih.ancho][ih.alto];
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