C/Visual C - Ayuda con programa para leer ficheros pcx

 
Vista:
sin imagen de perfil
Val: 185
Bronce
Ha aumentado 1 puesto en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Ayuda con programa para leer ficheros pcx

Publicado por carlos (95 intervenciones) el 21/04/2018 01:28:27
Buenas, pongo aqui una duda que tengo le doy vueltas pero no doy con la tela

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
#include <stdio.h>
char nombre[60];
int main(){
	int opcion;
	char number[3];
FILE* fichero;
int compresion,ancho,alto,tamano,color,pcx;
char version[3];
char marca1,marca2,marca3;
printf("1º OPCION PARA BMP\n 2ºOPCION PARA GIF\n 3ºopcion para pcx");
gets(number);
sscanf(number,"%d",&opcion);
switch(opcion){
 
	case 1:
puts("Comprobacion de imagen BMP\n");
printf("Seleccione archivo");
gets(nombre);
fichero= fopen(nombre,"rb");
if(fichero==NULL){
	puts("no encontrado o no existe");
}
else{
marca1 =fgetc(fichero);
marca2 = fgetc(fichero);
 
if((marca1=='B')&&(marca2=='M'))
{
	printf("Marca del fichero: %c%c\n",marca1,marca2);
	fseek(fichero,18,SEEK_SET);
	fread(&ancho,1,4,fichero);
	printf("Ancho:%d\n",ancho);
	fread(&alto,1,4,fichero);
	printf("alto:%d\n",alto);
	fseek(fichero,4,SEEK_CUR);
	fread(&compresion,1,4,fichero);
	printf("tamano :%d\n",compresion);
	fseek(fichero,2,SEEK_SET);
	fread(&tamano,1,4,fichero);
	printf("su tamano es:%d\n",tamano);
	fclose(fichero);
	switch(compresion)
	{
		case 0: printf("Sin compresion"); break;
		case 1: printf("Compresion RLE 8 bits"); break;
		case 2: printf("Compresion RLE 4bits"); break;
		case 3:puts("codificacion mascara de bits"); break;
	}
}
else
printf("bmp no detectado");
}
break;
 
case 2:
	printf("Ha elegido GIF\n");
	printf("Introduzca el nombre.gif");
 
	gets(nombre);
fichero= fopen(nombre,"rb");
if(fichero==NULL){
	puts("no encontrado o no existe");
}
else{
marca1 =fgetc(fichero);
marca2 = fgetc(fichero);
marca3 = fgetc(fichero);
if((marca1=='G')&&(marca2=='I')&&(marca3=='F'))
{
	printf("Marca del fichero: %c%c%c\n",marca1,marca2,marca3);
	fseek(fichero,6,SEEK_SET);
	fread(&ancho,1,2,fichero);
	printf("Ancho:%d\n",ancho);
	fseek(fichero,8,SEEK_SET);
	fread(&alto,1,2,fichero);
	printf("alto:%d\n",alto);
	fseek(fichero,3,SEEK_SET);
	fread(&version,1,3,fichero);
	printf("version :%s\n",version);
	fseek(fichero,10,SEEK_SET);
	fread(&color,1,1,fichero);
	printf("tiene:%d colores\n",color);
	fclose(fichero);
}
else
printf("gif no detectado");
}
	break;
	case 3:
		printf("HAS SELECCIONADO PCX\n");
		int ancho_MIN,ancho_MAX,alto_MAX,alto_MIN,versions;
		printf("Selecciona archivo\n");
		gets(nombre);
		fichero= fopen(nombre,"rb");
		if(fichero==NULL){
			puts("Te has equivocado o no existe");
		}
else{
pcx =fgetc(fichero);
if(pcx==10)
printf("Correcto\n");
fseek(fichero,1,SEEK_SET);
fread(&versions,1,1,fichero);
if(versions==0){
	printf("2.5\n");
 
}
else if(versions==2){
	printf("2.8\n");
 
}
else if(versions==3){
	printf("2.8+ paleta\n");
 
}
else if(versions==4){
	printf("paitbrush\n");
}
else if(versions==5){
	printf("3.0, superior\n");
}
else{
	printf("DAFUQ\n");
}
fseek(fichero,4,SEEK_SET);
fread(&ancho_MIN,2,1,fichero);
printf("ancho minimo %d\n",ancho_MIN);
/////////
fseek(fichero,6,SEEK_SET);
fread(&alto_MIN,2,1,fichero);
printf("alto minimo %d\n",alto_MIN);
////////////////////
fseek(fichero,8,SEEK_SET);
fread(&ancho_MAX,2,1,fichero);
printf("ancho maximo %d\n",ancho_MAX);
////////////////
fseek(fichero,10,SEEK_SET);
fread(&alto_MAX,2,1,fichero);
printf("alto maximo %d\n",alto_MAX);
///////////////////
 
printf("\\\\\\\\\\\\\\\\\n");
printf("la anchura es: %d\n",ancho_MAX-ancho_MIN+1);
printf("la altura es: %d\n",alto_MAX-alto_MIN+1);
}
return 0;
}
}

Quiero leer del gif y del pcx informacion(resolución) pero me salen numeros raros y segun la cabecera deberian ser esos sitios pero es solo con el ancho

Alguien me ayuda

Cabeceras leidos:
https://es.wikipedia.org/wiki/PCX
http://www.onicos.com/staff/iz/formats/gif.html
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Ayuda con programa para leer ficheros pcx

Publicado por Tom (619 intervenciones) el 21/04/2018 16:39:45
Te sobran la mitad de los fseek() ...
¿ No te parece más ... compacto algo como esto: ?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#define PCX_HEADER_SZ 128
 
struct PCX {
	char id, version, encoding, bpp;
	short xmin, ymin, xmax, ymax;
	short hdpi, vdpi;
	char cmap[48];
	char res, planes;
	short bpl, pal, hsize, vsize;
	char zero[54];
};
 
/* */
int main(int argc, char *argv[]) {
	FILE *fin = fopen("marbles.pcx", "r");
 
	if(fin) {
		struct PCX header = {0};
		size_t hlen = fread(&header, 1, sizeof(header), fin);
		if(hlen == PCX_HEADER_SZ) {
			printf("Image size %dx%d\n", header.xmax - header.xmin + 1, header.ymax -header.ymin + 1);
		} else {
			fprintf(stderr, "Read %ld bytes and must be %d\n", hlen, PCX_HEADER_SZ);
		}
		fclose(fin);
	} else {
		perror("marbles.pcx");
	}
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
sin imagen de perfil
Val: 185
Bronce
Ha aumentado 1 puesto en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Ayuda con programa para leer ficheros pcx

Publicado por carlos (95 intervenciones) el 21/04/2018 17:41:06
Es que no se otro modo que no sea fseek, o al menos en lo que he estudiado

Si no es mucha molestia ¿me podrias explicar como funciona el programa que has pasado?
y porque es Short en vez de int en las variables
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar