Ir ao conteúdo
  • Cadastre-se

Arquivos .BMP


Gabriel_Moro

Posts recomendados

estou tentando ler arquivos .BMP e não estou conseguindo, o site mais interessante sobre os .bmp que eu achei foi http://www.dragonwins.com/domains/getteched/bmp/bmpfileformat.htm (estou me baseando nele)

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

typedef struct cabecalhoArquivo{
	char bfType1;
	char bfType2;
	int bfSize;
	short bfReserved1;
	short bfReserved2;
	int bfOffBits;
}CABECALHOARQUIVO;

typedef struct cabecalhoImagem{
	int biSize;
	int biWidth;
	int biHeight;
	short biPlanos;
	short biBitCount;
	int biCompression;
	int biSizeImage;
	int biXPelsPerMeter;
	int biYPelsPerMeter;
	int biClrUsed;
	int biClrImportant;
}CABECALHOIMAGEM;

int main(void) {
	setbuf(stdout,NULL);

	CABECALHOARQUIVO *cara=malloc(sizeof(CABECALHOARQUIVO));
	CABECALHOIMAGEM *cabI=malloc(sizeof(CABECALHOIMAGEM));

	FILE *f=fopen("st1012.bmp", "rb+");

	fread(cara, sizeof(CABECALHOARQUIVO), 1, f);

	printf("Tipo: %c%c, Tamanho: %d, BfReserved1: %hd, BfReserved2: %hd, BfOffBits: %d", cara->bfType1, cara->bfType2, cara->bfSize, cara->bfReserved1, cara->bfReserved2, cara->bfOffBits);

	fread(cabI, sizeof(CABECALHOIMAGEM), 1, f);

	printf("\nBiSize: %d, BiWidth: %d, BiHeight: %d, BiPlanos: %hd, BiBitCount: %hd, BiCompression: %d, BiSizeImage: %d, BiXPelsPerMeter: %d, BiYPelsPerMeter: %d, BiClrUsed: %d, BiClrImportant: %d", cabI->biSize, cabI->biWidth, cabI->biHeight, cabI->biPlanos, cabI->biBitCount, cabI->biCompression, cabI->biSizeImage, cabI->biXPelsPerMeter, cabI->biYPelsPerMeter, cabI->biClrUsed, cabI->biClrImportant);

	fclose(f);

	return EXIT_SUCCESS;
}

 

st1012.bmp

Link para o comentário
Compartilhar em outros sites

Certamente você esta tendo problemas com o alinhamento dos bytes dentro das estruturas. Para você entender melhor esse problema lhe recomendo você dar uma pesquisada na internet.
Vou lhe deixar aqui um link que lhe ira dar a ponta inicial do fio para você desenrolar o problema: https://0xc0de.wordpress.com/2008/10/31/alinhamento-alignment-e-preenchimento-padding/

 

Neste tema aqui você pode averiguar como o compilador faz o calculo para o padding dependendo do tamanho da palavra utilizada no seu sistema. Basicamente a palavra é a quantidade em bits do seu sistema operativo pode processar, então o compilador faz alguns ajustes para que em cada viagem(ciclo de processamento) não faça vazio, se não que o compilador se ocupa de que cada ciclo o processador tenha por exemplo 32 bits. Imagine que você tem 3 chars e um int, e seu sistema seja de 32bits o sistema pode pegar 3 chars somar um byte para poder formar 32 bits que é exatamente o tamanho que pode calcular o sistema, dai ele processa os 3+1 chars e na segunda passada calcula o int que equivale a 4 bytes ou 32bits. Então como falei o sistema pode combinar dados e preenche-los de modo que mantenha o processador ocupado todo o tempo e leve sempre a maior quantidade de dados em cada ciclo.

Em fim... não sei se expliquei bem, mas lhe recomendo que leia as paginas que lhe passei. A pagina que está em stack overflow lhe mostra como resolver esse problema desativando o preenchimento de dados com o comando #pragma pack(1) antes de declarar a estrutura. https://pt.stackoverflow.com/questions/50614/como-funciona-o-padding-do-c

 

Estudar esses temas vai lhe ajudar a ser muito melhor programador. Se depois de ler tudo não conseguir pergunte aqui novamente.

Link para o comentário
Compartilhar em outros sites

não estou compreendendo essa leitura...

assim como deviria ser não funciona

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

typedef struct cabecalhoArquivo {
	unsigned short int bfType;

	unsigned long int bfSize;

	unsigned short int bfReserved1;

	unsigned short int bfReserved2;

	unsigned long int brOffbits;
} CABECALHOARQUIVO;

int main () {
CABECALHOARQUIVO *cara = malloc(sizeof(CABECALHOARQUIVO));

	FILE *f = fopen("st1012.bmp", "rb");

	fread(cara, sizeof(CABECALHOARQUIVO), 1, f);

	printf("Tipo: %x, Tamanho: %ld, BfReserved1: %hd, BfReserved2: %hd, BfOffBits: %ld", cara->bfType, cara->bfSize, cara->bfReserved1, cara->bfReserved2, cara->brOffbits);

	fclose(f);
return 0 ;
}

e assim Byte a Byte funciona

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

typedef struct cabecalhoArquivo{
	unsigned char bfType1;
	unsigned char bfType2;

	unsigned char bfSize1;
	unsigned char bfSize2;
	unsigned char bfSize3;
	unsigned char bfSize4;

	unsigned char bfReserved11;
	unsigned char bfReserved12;

	unsigned char bfReserved21;
	unsigned char bfReserved22;

	unsigned char brOffbits1;
	unsigned char brOffbits2;
	unsigned char brOffbits3;
	unsigned char brOffbits4;
}CABECALHOARQUIVO;

int main(void) {
	setbuf(stdout,NULL);

	CABECALHOARQUIVO *cara=malloc(sizeof(CABECALHOARQUIVO));

	FILE *f=fopen("st1012.bmp", "rb");

	fread(cara, sizeof(CABECALHOARQUIVO), 1, f);

	printf("Tipo: %x %x, Tamanho: %x %x %x %x, BfReserved1: %x %x, BfReserved2: %x %x, BfOffBits: %x %x %x %x", cara->bfType1, cara->bfType2, cara->bfSize4, cara->bfSize3, cara->bfSize2, cara->bfSize1, cara->bfReserved12, cara->bfReserved11, cara->bfReserved22, cara->bfReserved21, cara->brOffbits4, cara->brOffbits3, cara->brOffbits2, cara->brOffbits1);

	fclose(f);

	return EXIT_SUCCESS;
}

 

Link para o comentário
Compartilhar em outros sites

Se não leu o que eu coloquei antes de nada vai adiantar. Se não compreender as paginas que mencionei você não saberá o que causa o problema, e não só isso.... sempre que for ler uma arquivo vai passar pelo mesmo problema.

Não precisa ler byte a byte, você pode fazer um fread de cada uma das variáveis membro em ordem e irá funcionar, o problema está quando tentar ler a estrutura completa como você fez de primeiramente.

Fica difícil explicar aqui pelo fórum, se quiser entrar aqui no discord posso lhe proporcionar uma melhor explicação, caso contrario pouco posso fazer para lhe ajudar. https://discord.gg/CtfUywV

adicionado 1 minuto depois
43 minutos atrás, Gabriel_Moro disse:

assim como deviria ser não funciona

"assim como deveria ser" é o que você acha que deve ser, e não o que é realmente. >_<

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...