Utilisez le langage C pour lire les fichiers BMP

Qu'est-ce que bmp

BMP est une forme de bitmap, bitmap nom l' indique en abrégé, est un bitmap qui est Windows bitmap. Elle est généralement constituée de quatre parties: bloc d' en- tête, les informations de description du bloc d'image, table de couleur (table de couleurs en vrai mode couleur n) et la région de données d'image. Stocké dans le système à l' extension BMP.
  Ouvrez le programme Windows Paint, lorsque vous enregistrez l'image, vous pouvez voir trois options: bitmap 2 couleurs (noir et blanc), bitmap 16 couleurs, bitmap 256 couleurs et bitmap 24 bits. Ceci est l'outil le plus commun génère bitmap, où le format bitmap BMP expliquer, se réfère principalement à un bitmap généré par le dessin.
  L'image générale est de 24, qui est, vraie couleur. Chaque octet de 8 bits, 24 est utilisé pour stocker trois octets d'informations pour chaque pixel, correspondant à trois octets de stockage r, g, b données des trois couleurs primaires de chaque octet sont stockés gamme 0- 255. De sorte que, pour chaque pixel à savoir le stockage de 32 bits de la figure r, g, b, a ( alpha canal, mémoriser la transparence) de quatre données. La figure 8 est gris uniquement ce type d'information, ainsi que l' image binaire, qui ne dispose que de deux couleurs, noir ou blanc.
Maintenant , pour expliquer les quatre composantes du BMP:

1. Le bloc d'en-tête de fichier

en-tête du fichier (14 octets) stocke le type de fichier, la taille du fichier et d'autres informations

 // 文件信息头结构体
typedef struct tagBITMAPFILEHEADER 
{
   /unsigned short bfType;        // 19778,必须是BM字符串,对应的十六进制为0x4d42,十进制为19778,否则不是bmp格式文件
    unsigned int   bfSize;        // 文件大小 以字节为单位(2-5字节)
    unsigned short bfReserved1;   // 保留,必须设置为0 (6-7字节)
    unsigned short bfReserved2;   // 保留,必须设置为0 (8-9字节)
    unsigned int   bfOffBits;     // 从文件头到像素数据的偏移  (10-13字节)
} BITMAPFILEHEADER;

La description de l'image bloc d'information

en-tête d'image (40 octets) stocke les informations de taille de l'image, l'indice de couleur, plan de bits et ainsi de suite


//图像信息头结构体
typedef struct tagBITMAPINFOHEADER 
{
   unsigned int    biSize;          // 此结构体的大小 (14-17字节)
   long            biWidth;         // 图像的宽  (18-21字节)
   long            biHeight;        // 图像的高  (22-25字节)
   unsigned short  biPlanes;        // 表示bmp图片的平面属,显然显示器只有一个平面,所以恒等于1 (26-27字节)
   unsigned short  biBitCount;      // 一像素所占的位数,一般为24   (28-29字节)
   unsigned int    biCompression;   // 说明图象数据压缩的类型,0为不压缩。 (30-33字节)
   unsigned int    biSizeImage;     // 像素数据所占大小, 这个值应该等于上面文件头结构中bfSize-bfOffBits (34-37字节)
   long            biXPelsPerMeter; // 说明水平分辨率,用象素/米表示。一般为0 (38-41字节)
   long            biYPelsPerMeter; // 说明垂直分辨率,用象素/米表示。一般为0 (42-45字节)
   unsigned int    biClrUsed;       // 说明位图实际使用的彩色表中的颜色索引数(设为0的话,则说明使用所有调色板项)。 (46-49字节)
   unsigned int    biClrImportant;  // 说明对图象显示有重要影响的颜色索引的数目,如果是0,表示都重要。(50-53字节)
} BITMAPINFOHEADER;

3. Table de couleurs

Palette (déterminée par le numéro d'index de couleur) ne peut pas [ces informations]

//24位图像素信息结构体,即调色板
typedef struct _PixelInfo {
    unsigned char rgbBlue;   //该颜色的蓝色分量  (值范围为0-255)
    unsigned char rgbGreen;  //该颜色的绿色分量  (值范围为0-255)
    unsigned char rgbRed;    //该颜色的红色分量  (值范围为0-255)
    unsigned char rgbReserved;// 保留,必须为0
} PixelInfo;

La zone de données d'image

les données bitmap (déterminée par la taille de l'image) de chaque pixel de l'information stockée ici

Ensuite, la table des couleurs zone de données de fichier d'image en mode point binaire est enregistré dans cette section pour chaque couleur point correspondant à un nombre de pixels qui est également enregistré avec le mode de couleur du mode, à la fois l'image 2-couleur pour chaque point représentant un (8 bits 1 octet), l' image de 16 couleur représentant chacune des quatre points (grignote), l' image 256 couleurs est de 8 bits (1 octet par point); véritable image en couleurs représentant 24 bits (3 octets par point). Par conséquent, la taille de la zone de données va aussi changer. , Par sa loi même, il peut être de la formule suivante: = taille de données d'image (Largeur image de hauteur des bits enregistrés pixels) / 8.

Cependant, la taille de la zone d'information d'image non compressée. En plus du mode réel de la couleur, demeurant égale ou supérieure à la taille de l'information de données. Pourquoi est - ce? Il y a deux raisons: la
  ligne de 1.bmp d'un fichier d'image est enregistré en octets. Ainsi, il n'y a pas d' information de point d'un octet de bits de données représentés dans deux rangées différentes. Autrement dit, le mode d'affichage en couleurs de 16 bits est prévu en deux points chaque octet de l'information d'allocation, si la largeur de l'image du bit impair, les dernières informations de pixel d'un octet sera exclusivement après cet octet 4 il ne sera pas logique. L'octet suivant pour commencer l' enregistrement d' informations pour la ligne suivante.
  2. Pour plus de commodité d'affichage, en plus de vraie couleur, les autres octets par ligne dans le numéro de modèle de couleur à utiliser les données « 00 » est rempli multiple entier de quatre. Si le mode d'affichage en couleurs 16, lorsque la largeur de l'image 19, lors du stockage de chaque rangée aura ajouté de la 4- (19/2 + 1)% 4 = 2 octets (plus 1 parce qu'il y a un pixel devant être monopolisé un octet). Si le mode d'affichage 256 couleurs, lorsque la largeur de l'image 19, chaque ligne a également complété 4-19% 4 = 1 octet.
  Un autre point que je voudrais dire, lorsque l'écran est initialisé en mode 16 ou 256 couleurs, assurez - vous de définir la palette de couleurs ou de la valeur de la correction des couleurs, ou ne peut pas obtenir la couleur correcte de l' image.

Dire trop abstraite, nous ouvrons maintenant un fichier bmp, jetez un coup d' oeil.
Insérer ici l'image Description
Rappelez - vous les informations d'image: 像素是502x179 大小是263KB 所占269986个字节
Insérer ici l'image Description
Nous utilisons les ULtraEditfichiers bmp ouverts. Affiche le code hexadécimal.
Insérer ici l'image Description
Maintenant , nous allons lire le code pour voir ce qu'ils ont sauvé des choses à la fin.
Il convient de noter ici que

les données de Windows est lu en arrière, ce qui est une caractéristique des ordinateurs PC. Si une donnée est de 42 4D, est lu en arrière 4D 42, à savoir 0x4D42.
Par conséquent, si les données bfSize pour A2 1E 04 00, en fait, est devenu 0x00041EA2, qui est 0x41EA2.

Insérer ici l'image Description
Les informations suivantes peuvent lire ce fichier.

unsigned short bfType          = 0x4D42     = 19778
unsigned int   bfSize          = 0x41EA2    = 269986字节=269986/1024=263kb
unsigned short bfReserved1     = 00 00 
unsigned short bfReserved2     = 00 00
unsigned int   bfOffBits       = 0X00000036 = 0x36 = 54字节

unsigned int   biSize          = 0x00000028 = 0x28  = 40字节          
int            biWidth         = 0x0001f6   = 0x1f6 = 502像素;       
int            biHeight        = 0x000000B3 = 0xB3  = 179像素 ;     
unsigned short biPlanes        = 0x0001 0x1 = 1;                  
unsigned short biBitCount      = 0x0018     = 0x18  = 24;           
unsigned int   biCompression   = 0x00000000 = 0;               
unsigned int   biSizeImage     = 0x00000000 = 0;                
int            biXPelsPerMeter = 0x00001273 = 0x1273 = 4723; 
int            biYPelsPerMeter = 0x00001273 = 0x1273 = 4723;  
unsigned int   biClrUsed       = 0x00000000 = 0;                   
unsigned int   biClrImportant  = 0x00000000 = 0;             


unsigned char rgbBlue  = 0x496864 其中R:0X64 G:0X68 B:0X49 ;   //该颜色的蓝色分量  (值范围为0-255)
unsigned char rgbGreen = 0x4A6965 其中R:0X65 G:0X69 B:0X4A ;   //该颜色的绿色分量  (值范围为0-255)
unsigned char rgbRed   = 0x496663 其中R:0X63 G:0X66 B:0X49 ;   //该颜色的红色分量  (值范围为0-255)
unsigned char rgbReserved;  // 保留,必须为0

écrire du code

Prenez est d'utiliser le langage C pour lire bmp fichier, pour voir si l'information spécifique nous avons lu le texte de binaire et le débogage même.

  • Ici , vous devez savoir au sujet de la structure et du pointeur du fichier langage C. Sinon , le code si simple, vous pouvez probablement pas lire.
    Voici deux morceaux de code que vous pouvez copier directement à votre projet, notez que ce milieu C, non c ++ environnement.

fichier C

# ifndef BMP_H
# define BMP_H
/*
BMP格式
这种格式内的数据分为三到四个部分,依次是:
文件信息头 (14字节)存储着文件类型,文件大小等信息
图片信息头 (40字节)存储着图像的尺寸,颜色索引,位平面数等信息
调色板 (由颜色索引数决定)【可以没有此信息】
位图数据 (由图像尺寸决定)每一个像素的信息在这里存储

一般的bmp图像都是24位,也就是真彩。每8位为一字节,24位也就是使用三字节来存储每一个像素的信息,三个字节对应存放r,g,b三原色的数据,
每个字节的存贮范围都是0-255。那么以此类推,32位图即每像素存储r,g,b,a(Alpha通道,存储透明度)四种数据。8位图就是只有灰度这一种信息,
还有二值图,它只有两种颜色,黑或者白。
*/
// 文件信息头结构体
typedef struct tagBITMAPFILEHEADER 
{
    //unsigned short bfType;        // 19778,必须是BM字符串,对应的十六进制为0x4d42,十进制为19778,否则不是bmp格式文件
    unsigned int   bfSize;        // 文件大小 以字节为单位(2-5字节)
    unsigned short bfReserved1;   // 保留,必须设置为0 (6-7字节)
    unsigned short bfReserved2;   // 保留,必须设置为0 (8-9字节)
    unsigned int   bfOffBits;     // 从文件头到像素数据的偏移  (10-13字节)
} BITMAPFILEHEADER;

//图像信息头结构体
typedef struct tagBITMAPINFOHEADER 
{
    unsigned int    biSize;          // 此结构体的大小 (14-17字节)
    long            biWidth;         // 图像的宽  (18-21字节)
    long            biHeight;        // 图像的高  (22-25字节)
    unsigned short  biPlanes;        // 表示bmp图片的平面属,显然显示器只有一个平面,所以恒等于1 (26-27字节)
    unsigned short  biBitCount;      // 一像素所占的位数,一般为24   (28-29字节)
    unsigned int    biCompression;   // 说明图象数据压缩的类型,0为不压缩。 (30-33字节)
    unsigned int    biSizeImage;     // 像素数据所占大小, 这个值应该等于上面文件头结构中bfSize-bfOffBits (34-37字节)
    long            biXPelsPerMeter; // 说明水平分辨率,用象素/米表示。一般为0 (38-41字节)
    long            biYPelsPerMeter; // 说明垂直分辨率,用象素/米表示。一般为0 (42-45字节)
    unsigned int    biClrUsed;       // 说明位图实际使用的彩色表中的颜色索引数(设为0的话,则说明使用所有调色板项)。 (46-49字节)
    unsigned int    biClrImportant;  // 说明对图象显示有重要影响的颜色索引的数目,如果是0,表示都重要。(50-53字节)
} BITMAPINFOHEADER;

//24位图像素信息结构体,即调色板
typedef struct _PixelInfo {
    unsigned char rgbBlue;   //该颜色的蓝色分量  (值范围为0-255)
    unsigned char rgbGreen;  //该颜色的绿色分量  (值范围为0-255)
    unsigned char rgbRed;    //该颜色的红色分量  (值范围为0-255)
    unsigned char rgbReserved;// 保留,必须为0
} PixelInfo;

#endif

h fichier d'en-tête

#include <stdio.h>
#include <malloc.h>
#include "BmpFormat.h"

BITMAPFILEHEADER fileHeader;
BITMAPINFOHEADER infoHeader;

void showBmpHead(BITMAPFILEHEADER pBmpHead) 
{  //定义显示信息的函数,传入文件头结构体
    printf("BMP文件大小:%dkb\n", fileHeader.bfSize/1024);
    printf("保留字必须为0:%d\n",  fileHeader.bfReserved1);
    printf("保留字必须为0:%d\n",  fileHeader.bfReserved2);
    printf("实际位图数据的偏移字节数: %d\n",  fileHeader.bfOffBits);
}
void showBmpInfoHead(BITMAPINFOHEADER pBmpinfoHead) 
{//定义显示信息的函数,传入的是信息头结构体
   printf("位图信息头:\n" );   
   printf("信息头的大小:%d\n" ,infoHeader.biSize);   
   printf("位图宽度:%d\n" ,infoHeader.biWidth);   
   printf("位图高度:%d\n" ,infoHeader.biHeight);   
   printf("图像的位面数(位面数是调色板的数量,默认为1个调色板):%d\n" ,infoHeader.biPlanes);   
   printf("每个像素的位数:%d\n" ,infoHeader.biBitCount);   
   printf("压缩方式:%d\n" ,infoHeader.biCompression);   
   printf("图像的大小:%d\n" ,infoHeader.biSizeImage);   
   printf("水平方向分辨率:%d\n" ,infoHeader.biXPelsPerMeter);   
   printf("垂直方向分辨率:%d\n" ,infoHeader.biYPelsPerMeter);   
   printf("使用的颜色数:%d\n" ,infoHeader.biClrUsed);   
   printf("重要颜色数:%d\n" ,infoHeader.biClrImportant);   
}

int main()
{
    FILE* fp;    
    fp = fopen("1.bmp", "rb");//读取同目录下的image.bmp文件。
    if(fp == NULL)
    {
        printf("打开'image.bmp'失败!\n");
        return -1;
    }
    //如果不先读取bifType,根据C语言结构体Sizeof运算规则——整体大于部分之和,从而导致读文件错位
    unsigned short  fileType;   
    fread(&fileType,1,sizeof (unsigned short), fp);  
    if (fileType = 0x4d42)   
    {   
        printf("文件类型标识正确!" );  
        printf("\n文件标识符:%d\n", fileType); 
        fread(&fileHeader, 1, sizeof(BITMAPFILEHEADER), fp);
        showBmpHead(fileHeader);
        fread(&infoHeader, 1, sizeof(BITMAPINFOHEADER), fp);
        showBmpInfoHead(infoHeader);
        fclose(fp);        
    }
}

Rappelez - vous bmp nom de fichier est 1.bmp, c'est mon nom de fichier. Bien sûr, vous pouvez facilement mettre en place. Et prendre des photos et vos fichiers de code dans le même dossier.
Ensuite , vous le code de débogage.
Je suis ici est vscode le code de débogage. D' autres compilateurs peuvent, si vous voulez installer vscode voir: 10 minutes pour construire VScode de l'environnement de développement C / C,
code écrit après la fin de la presse F5, pour le débogage.
Insérer ici l'image Description
Peut voir cette information est exacte, montre que notre programme ne se trompe pas, nous amène à réaliser bmp par le langage C à lecture est terminée, nous atteindrons lire et enregistrer le fichier bmp, examiner spécifiquement mes autres articles.

algorithmes de stockage

Les fichiers BMP sont généralement pas compressés, donc ils sont généralement beaucoup plus grande que les formats de fichiers d'images compressées de la même image. Par exemple, un 800 × 600 24 occupe presque l' espace 1.4MB. Ils ne sont généralement pas adaptés pour la transmission sur Internet ou tout autre moyen ou à faible vitesse a une capacité limitée. En fonction de la profondeur de couleur d'un pixel sur l'image peut être représentée par un ou plusieurs octets, qui est déterminé par n / 8 (n est la profondeur de bit, un octet est composé de 8 bits). navigateur image comme pixel de couleur est calculée en fonction de la valeur d'octet ASCII et lit ensuite les valeurs correspondantes de la palette. Des informations plus détaillées, s'il vous plaît consulter la section ci - dessous sur le fichier bitmap. 2n nombre approximatif d'octets bitmaps de couleur à N bits selon la formule suivante:. La taille du fichier BMP approximativement égale 4 + 54 est le n-ième + (w 2 h * n) / 8, dans lequel la hauteur et la largeur des pixels sont . On notera que dans la formule ci - dessus 54 sont en- tête de fichier bitmap, la taille de la palette de couleurs. A noter également que c'est une approximation, pour les images bitmap n bits, bien qu'il puisse y avoir un maximum de couleurs 2n, et une image particulière peut ne pas utiliser toutes ces couleurs. Depuis que définit l'image couleur de la palette de couleurs est utilisée, elle sera inférieure à la palette de couleurs réelle. Si vous voulez savoir comment ces valeurs sont dérivées, s'il vous plaît se référer à la section formats de fichiers suivants. En raison de facteurs déterminés par l'algorithme lui - même est stocké, calculé à partir de plusieurs paramètres d'image différents et la taille de la taille réelle du fichier sera quelques différences mineures.

Publié 18 articles originaux · louange won 4 · Vues 1316

Je suppose que tu aimes

Origine blog.csdn.net/qq_39400113/article/details/104750460
conseillé
Classement