首頁 >後端開發 >C++ >如何在純 C/C 中從布林矩陣建立單色 BMP 影像?

如何在純 C/C 中從布林矩陣建立單色 BMP 影像?

DDD
DDD原創
2024-12-10 07:49:09541瀏覽

How to Create a Monochrome BMP Image from a Boolean Matrix in Pure C/C  ?

在純 C/C 中建立單色 BMP 影像

點陣圖影像檔案廣泛用於儲存數位影像。本文解決了將布林矩陣寫入單色 BMP 檔案的需求,如果對應的矩陣元素為 true,則像素設為白色。

了解 BMP 標頭

BMP 檔案格式具有特定的標頭結構,其中包含有關影像的基本資訊。文件頭由兩部分組成:文件頭和資訊頭。

檔案頭

  • 大小(14 位元組): 檔案大小(以位元組為單位)。
  • 識別符 (2位元組): 用於將檔案標識為 BMP 的簽章「BM」。
  • 保留(4 位元組): 保留供將來使用(設定為零)。
  • 影像資料的偏移(4 個位元組): 從檔案開頭到像素開頭的偏移量(以位元組為單位) data.

訊息標頭

  • 大小(40位元組): 訊息標頭的大小。
  • 寬度(4位元組):中影像的寬度像素。
  • 高度(4 位元組): 影像的高度(以像素為單位)。
  • 平面(2 位元組): 總是設定為1 .
  • 位數(2 位元組): 每像素1 位元單色圖像。
  • 壓縮(4 位元組): 0 表示未壓縮。
  • 影像資料大小(4 位元組): 影像資料的大小像素資料(以位元組為單位)。
  • XPelsPerMeter 和 YPelsPerMeter(4 位元組)每個): 影像的水平和垂直分辨率,以每米像素為單位。
  • 調色盤(4 位元組): 調色盤中的顏色數量(單色設定為 0)圖片)。
  • 重要顏色(4 位元組): 調色板中重要顏色的數量(設定為0(單色圖像)。

建立單色BMP

建立單色BMP:

  1. 計算檔案大小以及影像資料的偏移量。二維布林值數組。 true)。 >將每行填入為4 位元組的倍數以確保對齊。 🎜>
  2. 範例程式碼
  3. 以下C/C 程式碼示範了從布林矩陣建立單色 BMP:
  4. #include <stdio.h>
    #include <stdlib.h>
    
    int main() {
        FILE *f;
        unsigned char *img = NULL;
        int filesize = 54 + 3*w*h;  //w is your image width, h is image height, both int
    
        img = (unsigned char *)malloc(3*w*h);
        memset(img,0,3*w*h);
    
        for(int i=0; i<w; i++)
        {
            for(int j=0; j<h; j++)
            {
                bool = matrix[i][j]
                x=i; y=(h-1)-j;
                r = bool? 255 : 0;
                g = bool? 255 : 0;
                b = bool? 255 : 0;
                img[(x+y*w)*3+2] = (unsigned char)(r);
                img[(x+y*w)*3+1] = (unsigned char)(g);
                img[(x+y*w)*3+0] = (unsigned char)(b);
            }
        }
    
        unsigned char bmpfileheader[14] = {'B','M', 0,0,0,0, 0,0, 0,0, 54,0,0,0};
        unsigned char bmpinfoheader[40] = {40,0,0,0, 0,0,0,0, 0,0,0,0, 1,0, 24,0};
        unsigned char bmppad[3] = {0,0,0};
    
        bmpfileheader[ 2] = (unsigned char)(filesize    );
        bmpfileheader[ 3] = (unsigned char)(filesize>> 8);
        bmpfileheader[ 4] = (unsigned char)(filesize>>16);
        bmpfileheader[ 5] = (unsigned char)(filesize>>24);
    
        bmpinfoheader[ 4] = (unsigned char)(       w    );
        bmpinfoheader[ 5] = (unsigned char)(       w>> 8);
        bmpinfoheader[ 6] = (unsigned char)(       w>>16);
        bmpinfoheader[ 7] = (unsigned char)(       w>>24);
        bmpinfoheader[ 8] = (unsigned char)(       h    );
        bmpinfoheader[ 9] = (unsigned char)(       h>> 8);
        bmpinfoheader[10] = (unsigned char)(       h>>16);
        bmpinfoheader[11] = (unsigned char)(       h>>24);
    
        f = fopen("img.bmp","wb");
        fwrite(bmpfileheader,1,14,f);
        fwrite(bmpinfoheader,1,40,f);
        for(int i=0; i<h; i++)
        {
            fwrite(img+(w*(h-i-1)*3),3,w,f);
            fwrite(bmppad,1,(4-(w*3)%4)%4,f);
        }
    
        free(img);
        fclose(f);
    
        return 0;
    }

    此程式碼採用布林矩陣矩陣並建立具有指定寬度 (w) 和高度 (h) 的單色 BMP 影像。它將布林值轉換為像素值並將 BMP 檔案寫入磁碟。

以上是如何在純 C/C 中從布林矩陣建立單色 BMP 影像?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn