Me parece que estás empleando mal la función fseek. Suponiendo que abriste bien el archivo (espero que no lo hayas abierto para apendizarlo), vamos a ver que es lo que haces con los dos ciclos. En el primer ciclo varias a la variable i desde cabecera.Alto hasta 0. ¿Qué sucede cuando i tiene el valor de cabecera.Alto?, pues que en el segundo ciclo, el cual varias desde j = 0 hasta j = cabecera.Ancho, la función fseek toma estos valores
fseek(fde,(cabecera.Ancho-cabecera.Ancho)*sizeof(char),SEEK_CUR);
o sea, sustituyendo
fseek(fde,0,SEEK_CUR);
o sea que nunca mueves al apuntador del archivo, pero el que si lo mueve es la instrucción que pones enseguida de esta, que es
fread(&c, cabecera.Ancho*sizeof(char), 1, fde);
esta instrucción provoca que el apuntador se mueva tantos bytes como tenga cabecera.Ancho. Bueno, podríamos seguir analizando que haces en cada ciclo, pero espero que con esto poco te des cuenta donde hay que cambiar el código para corregirlo.