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
|
#include <stdio.h>
#include <stdlib.h>
#pragma pack(1)
typedef struct
{ //BITMAPFILEHEADER
char bfType[2];
int bfSize;
short bfReserved1;
short bfReserved2;
int bfOffBits;
//BITMAPINFOHEADER
int biSize;
int biWidth;
int biHeight;
short biPlanes;
short biBitCount;
int biCompression;
int biSizeImage;
int biXPelsPerMeter;
int biYPelsPerMeter;
int biClrUsed;
int biClrImportant;
} bmpInfo;
#pragma pack()
int imageInfo(bmpInfo *img)
{
int offset = 0;
printf("------------------------------------------------------------- BITMAPFILEHEADER\n");
printf("0x%08X (%08d) bfType %8c%c (0x%04X)\n", offset, offset, img->bfType[0], img->bfType[1], *(short *)img->bfType);
offset += sizeof img->bfType;
printf("0x%08X (%08d) bfSize %9d (0x%08X)\n", offset, offset, img->bfSize, img->bfSize);
offset += sizeof img->bfSize;
printf("0x%08X (%08d) bfReserved1 %9hd (0x%04hX)\n", offset, offset, img->bfReserved1, img->bfReserved1);
offset += sizeof img->bfReserved1;
printf("0x%08X (%08d) bfReserved2 %9hd (0x%04hX)\n", offset, offset, img->bfReserved2, img->bfReserved2);
offset += sizeof img->bfReserved2;
printf("0x%08X (%08d) bfOffBits %9d (0x%08X)\n", offset, offset, img->bfOffBits, img->bfOffBits);
printf("------------------------------------------------------------- BITMAPINFOHEADER\n");
offset += sizeof img->bfOffBits;
printf("0x%08X (%08d) biSize %9d (0x%08X)\n", offset, offset, img->biSize, img->biSize);
offset += sizeof img->biSize;
printf("0x%08X (%08d) biWidth %9d (0x%08X)\n", offset, offset, img->biWidth, img->biWidth);
offset += sizeof img->biWidth;
printf("0x%08X (%08d) biHeight %9d (0x%08X)\n", offset, offset, img->biHeight, img->biHeight);
offset += sizeof img->biHeight;
printf("0x%08X (%08d) biPlanes %9d (0x%04hX)\n", offset, offset, img->biPlanes, img->biPlanes);
offset += sizeof img->biPlanes;
printf("0x%08X (%08d) biBitCount %9d (0x%04hX)\n", offset, offset, img->biBitCount, img->biBitCount);
offset += sizeof img->biBitCount;
printf("0x%08X (%08d) biCompression %9d (0x%08X)\n", offset, offset, img->biCompression, img->biCompression);
offset += sizeof img->biCompression;
printf("0x%08X (%08d) biSizeImage %9d (0x%08X)\n", offset, offset, img->biSizeImage, img->biSizeImage);
offset += sizeof img->biSizeImage;
printf("0x%08X (%08d) biXPelsPerMeter %9d (0x%08X)\n", offset, offset, img->biXPelsPerMeter, img->biXPelsPerMeter);
offset += sizeof img->biXPelsPerMeter;
printf("0x%08X (%08d) biYPelsPerMeter %9d (0x%08X)\n", offset, offset, img->biYPelsPerMeter, img->biYPelsPerMeter);
offset += sizeof img->biYPelsPerMeter;
printf("0x%08X (%08d) biClrUsed %9d (0x%08X)\n", offset, offset, img->biClrUsed, img->biClrUsed);
offset += sizeof img->biClrUsed;
printf("0x%08X (%08d) biClrImportant %9d (0x%08X)\n", offset, offset, img->biClrImportant, img->biClrImportant);
return offset;
}
int main(void)
{
const char filename[] = "1.bmp";
FILE *fichier = fopen(filename, "rb");
if(!fichier)
printf ("Erreur a l'ouverture du fichier [%s]\n", filename);
else
{
bmpInfo *img = malloc(sizeof *img);
if(img)
{
int i, tmp, offset;
printf("\n[%s]\n", filename);
fread(img, sizeof(bmpInfo), 1, fichier);
if(img->bfType[0] == 'B' && img->bfType[1] == 'M')
{
offset = imageInfo(img);
if(img->biBitCount == 1)
{
printf("---------------------------------------------------------------------- RGBQUAD\n");
fread(&tmp, sizeof tmp, 1, fichier);
offset += sizeof img->biClrImportant;
printf("0x%08X (%08d) %9d (0x%08X)\n", offset, offset, tmp, tmp);
fread(&tmp, sizeof tmp, 1, fichier);
offset += sizeof tmp;
printf("0x%08X (%08d) %9d (0x%08X)\n", offset, offset, tmp, tmp);
printf("------------------------------------------------------------------------- BITS\n");
for(i = 0; i < img->biSizeImage / (int)sizeof tmp; i++)
{
char bin[33];
fread(&tmp, sizeof tmp, 1, fichier);
offset += sizeof tmp;
printf("0x%08X (%08d) %8d (0x%08X) (%s)\n", offset, offset, tmp, tmp, itoa(tmp, bin, 2));
}
}
}
free(img);
}
fclose(fichier);
}
return 0;
} |
Partager