Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
Gabriel_Moro

Arquivos .BMP

Recommended Posts

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

Compartilhar este post


Link para o post
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.

Compartilhar este post


Link para o post
Compartilhar em outros sites
  • Autor do tópico
  • 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;
    }

     

    Compartilhar este post


    Link para o post
    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. >_<

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Crie uma conta ou entre para comentar

    Você precisar ser um membro para fazer um comentário






    Sobre o Clube do Hardware

    No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

    ×