Enviado em 18/07/2013 - 02:31h
Olá pessoal, estava lendo um livro e em uma página ele mostra como é uma estrutura de um arquivo de bitmap:
#include <stdio.h>
#include <stdlib.h>
#define IMAGEM "teste.bmp"
//WORD == unsigned short %hu
//DWORD == unsigned long %lu
//LONG == long %li
struct bitmap
{
//Cabeçalho do arquivo bitmap
unsigned short bmp_tipo;//Tipo
unsigned long bmp_tam;//Tamanho total do arquivo
unsigned short bmp_reservado1;
unsigned short bmp_reservado2;
unsigned long bp_infocab;//Número de bytes daqui pra frente para acessar o Info header
//Informações para leitura do bitmap(Info reader)
unsigned long leitor_tam;//Tamanho da estrutura
long bmp_larg;//Largura
long bmp_alt;//Altura
unsigned short bmp_planos_cor;//Planos de cor(sempre 1)
unsigned short bmp_bpp;//Bits por pixel
unsigned long bmp_compressao;//Tipo de compressão
unsigned long bmp_tam_img;//Tamanho da imagem em bytes
long bmp_x_pxl_por_mtr;//Pixels por metro em x
long bmp_y_pxl_por_mtr;//Pixels por metro em y
unsigned long bmp_cont_cores;//Número de cores usadas
unsigned long bmp_cont_coresw;//Número de cores improtantes para o windows
//Paleta
unsigned char paleta[256];
//Dados para montagem da imagem(tamanho variável)
unsigned* dados;//Alocar memória antes da leitura dos dados
};
struct bitmap* ler_bitmap(FILE*, int*);
void liberar_bitmap(struct bitmap*);
int main(int argc, char* argv[])
{
int i, t;
FILE* img;
struct bitmap* bmp=NULL;
//Abre arquivo no modo binário
img = fopen(IMAGEM, "r+b");
if(img == NULL){
perror("fopen");
return 0;
}
bmp = ler_bitmap(img, &t);
if(bmp == NULL){
printf("Falha ao ler bitmap.\n");
return 0;
}
printf("Bitmap[%s]:\n", IMAGEM);
printf("=-=-=BITMAP ARQUIVO CABECALHO=-=-=\n");
printf("Tipo: 0x%x.\n", bmp->bmp_tipo);
printf("Tamanho total do arquivo: %lu bytes.\n", bmp->bmp_tam);
printf("Reservado1(?): %d.\n", bmp->bmp_reservado1);
printf("Reservado2(?): %d.\n", bmp->bmp_reservado2);
printf("Numero de bytes daqui pra frente para acessar o info reader: %lu.\n", bmp->bp_infocab);
printf("=-=-=BITMAP INFO CABECALHO=-=-=\n");
printf("Tamanho da estrutura: %lu bytes.\n", bmp->leitor_tam);
printf("larguraXaltura: %lix%li.\n", bmp->bmp_larg, bmp->bmp_alt);
printf("Numero de planos de cor(?): %d.\n", bmp->bmp_planos_cor);
printf("Bits/Bytes por pixel: %d - %d.\n", bmp->bmp_bpp, bmp->bmp_bpp/8);
printf("Tipo de compressao(?): %lu.\n", bmp->bmp_compressao);
printf("Tamanho da imagem: %lu bytes.\n", bmp->bmp_tam_img);
printf("Numero de pixels por metro em x e y(?): %li - %li.\n", bmp->bmp_x_pxl_por_mtr, bmp->bmp_y_pxl_por_mtr);
printf("Numero de cores usadas: %lu.\n", bmp->bmp_cont_cores);
printf("Numero de cores importantes para o Windows: %lu.\n", bmp->bmp_cont_coresw);
printf("=-=-=PALETA=-=-=\n");
printf("Paleta:\n");
for(i=0; i < 257; i++)
printf("0x%x ", bmp->paleta[i]);
puts("\n");
printf("=-=-=DADOS=-=-=\n");
for(i=0; i < t; i++)
printf("0x%x ", bmp->dados[i]);
liberar_bitmap(bmp);
return 0;
}
struct bitmap* ler_bitmap(FILE* arquivo, int* tdados)
{
int tcab=sizeof(struct bitmap)-sizeof(void*);
struct bitmap* bmp = (struct bitmap*)malloc(sizeof(struct bitmap));
if(bmp == NULL)
return NULL;
fread(bmp, tcab, 1, arquivo);//Lendo conteúdo do cabeçalho
//Quantidade de bytes nos dados
fseek(arquivo, 0, SEEK_END);
*tdados = ftell(arquivo) - tcab;
//Até 4 bytes por pixels(32 bits)
bmp->dados = (unsigned*)malloc(4*(*tdados));
if(bmp->dados == NULL)
return NULL;
//Posiciona no ponto de leitura
fseek(arquivo, tcab, SEEK_SET);
//Ler os dados
fread(bmp->dados, *tdados, 1, arquivo);
return bmp;
}
void liberar_bitmap(struct bitmap* bmp)
{
free(bmp->dados);
free(bmp);
}
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Como renomear arquivos de letras maiúsculas para minúsculas
Imprimindo no formato livreto no Linux
Vim - incrementando números em substituição
Efeito "livro" em arquivos PDF
Como resolver o erro no CUPS: Unable to get list of printer drivers
GLPI - Configuração de destinatário com conta Microsoft Exchange (0)
Vou voltar moderar conteúdos de Dicas e Artigos (3)
OpenVPN no MACBOOK conecta mas não pinga pastas de rede compartilhada ... (1)
Melhorando a precisão de valores flutuantes em python[AJUDA] (8)
[Python] Automação de scan de vulnerabilidades
[Python] Script para analise de superficie de ataque
[Shell Script] Novo script para redimensionar, rotacionar, converter e espelhar arquivos de imagem
[Shell Script] Iniciador de DOOM (DSDA-DOOM, Doom Retro ou Woof!)
[Shell Script] Script para adicionar bordas às imagens de uma pasta