音影片入門-05-RGB-TO-BMP使用開源庫

  • 2019 年 10 月 3 日
  • 筆記

* 音影片入門文章目錄 *

RGB-TO-BMP 回顧

將 RGB 數據轉成 BMP 圖片:

  1. 了解 BMP 文件格式
  2. 準備 BMP 文件頭資訊
  3. 準備 BMP 資訊頭
  4. BMP 存儲 RGB 的順序是 B-G-R
  5. BitmapInfoHeader 中的 biHeight 欄位,biHeight 為正,點陣圖自底向頂掃描,biHeight 為負,點陣圖自頂向底掃描。
  6. BMP 影像四位元組對齊

實際開發過程,通常會使用第三方開源庫來簡化開發,屏蔽一些底層的複雜度,節省大量編寫程式碼的時間。

使用開源庫的方式

libbmp (C 庫)

#include <stdio.h>  #include "libbmp/libbmp.h"    // 彩虹的七種顏色  u_int32_t rainbowColors[] = {          0XFF0000, // 紅          0XFFA500, // 橙          0XFFFF00, // 黃          0X00FF00, // 綠          0X007FFF, // 青          0X0000FF, // 藍          0X8B00FF  // 紫  };    int main() {      int width = 711, height = 711;      bmp_img img;      bmp_img_init_df (&img, width, height);        for (int i = 0; i < width; ++i) {          // 當前顏色          u_int32_t currentColor = rainbowColors[0];          if(i < 100) {              currentColor = rainbowColors[0];          } else if(i < 200) {              currentColor = rainbowColors[1];          } else if(i < 300) {              currentColor = rainbowColors[2];          } else if(i < 400) {              currentColor = rainbowColors[3];          } else if(i < 500) {              currentColor = rainbowColors[4];          } else if(i < 600) {              currentColor = rainbowColors[5];          } else if(i < 700) {              currentColor = rainbowColors[6];          }          // 當前顏色 R 分量          u_int8_t R = (currentColor & 0xFF0000) >> 16;          // 當前顏色 G 分量          u_int8_t G = (currentColor & 0x00FF00) >> 8;          // 當前顏色 B 分量          u_int8_t B = currentColor & 0x0000FF;          for (int j = 0; j < height; ++j) {              bmp_pixel_init (&img.img_pixels[i][j], R, G, B);          }      }        bmp_img_write (&img, "/Users/staff/Desktop/test-libbmp.bmp");      bmp_img_free (&img);      return 0;  }

google libbmp(C 庫)

#include <stdio.h>  #include "google/libbmp/src/bmpfile.h"    // 彩虹的七種顏色  u_int32_t rainbowColors[] = {          0XFF0000, // 紅          0XFFA500, // 橙          0XFFFF00, // 黃          0X00FF00, // 綠          0X007FFF, // 青          0X0000FF, // 藍          0X8B00FF  // 紫  };    int main(int argc, char **argv) {        int width = 711, height = 711;      bmpfile_t *bmp;      if ((bmp = bmp_create(width, height, 24)) == NULL) {          return -1;      }        for (int i = 0; i < width; ++i) {          // 當前顏色          u_int32_t currentColor = rainbowColors[0];          if(i < 100) {              currentColor = rainbowColors[0];          } else if(i < 200) {              currentColor = rainbowColors[1];          } else if(i < 300) {              currentColor = rainbowColors[2];          } else if(i < 400) {              currentColor = rainbowColors[3];          } else if(i < 500) {              currentColor = rainbowColors[4];          } else if(i < 600) {              currentColor = rainbowColors[5];          } else if(i < 700) {              currentColor = rainbowColors[6];          }          // 當前顏色 R 分量          u_int8_t R = (currentColor & 0xFF0000) >> 16;          // 當前顏色 G 分量          u_int8_t G = (currentColor & 0x00FF00) >> 8;          // 當前顏色 B 分量          u_int8_t B = currentColor & 0x0000FF;            rgb_pixel_t pixel = {B, G, R, 0};          for (int j = 0; j < height; ++j) {              bmp_set_pixel(bmp, j, i, pixel);          }      }        bmp_save(bmp, "/Users/staff/Desktop/test-google-libbmp.bmp");      bmp_destroy(bmp);      return 0;  }

bmp(C 庫)

#include <stdio.h>  #include "bmp/bmp.h"    // 彩虹的七種顏色  u_int32_t rainbowColors[] = {          0XFF0000, // 紅          0XFFA500, // 橙          0XFFFF00, // 黃          0X00FF00, // 綠          0X007FFF, // 青          0X0000FF, // 藍          0X8B00FF  // 紫  };    int main() {        int width = 711, height = 711;      char bmp[BMP_SIZE(width, height)];      bmp_init(bmp, width, height);        for (int i = 0; i < width; ++i) {            // 當前顏色          u_int32_t currentColor = rainbowColors[0];          if(i < 100) {              currentColor = rainbowColors[0];          } else if(i < 200) {              currentColor = rainbowColors[1];          } else if(i < 300) {              currentColor = rainbowColors[2];          } else if(i < 400) {              currentColor = rainbowColors[3];          } else if(i < 500) {              currentColor = rainbowColors[4];          } else if(i < 600) {              currentColor = rainbowColors[5];          } else if(i < 700) {              currentColor = rainbowColors[6];          }            for (int j = 0; j < height; ++j) {              bmp_set(bmp, j, i, currentColor);          }      }        FILE *f = fopen("/Users/hubin/Desktop/test-bmp.bmp", "wb");      fwrite(bmp, sizeof(bmp), 1, f);      fclose(f);      return 0;  }

qdbmp(C 庫)

#include <stdio.h>  #include "qdbmp/qdbmp.h"    // 彩虹的七種顏色  u_int32_t rainbowColors[] = {          0XFF0000, // 紅          0XFFA500, // 橙          0XFFFF00, // 黃          0X00FF00, // 綠          0X007FFF, // 青          0X0000FF, // 藍          0X8B00FF  // 紫  };    int main() {      int width = 711, height = 711;      BMP* bmp = BMP_Create(width, height, 24);        for (int i = 0; i < width; ++i) {          // 當前顏色          u_int32_t currentColor = rainbowColors[0];          if(i < 100) {              currentColor = rainbowColors[0];          } else if(i < 200) {              currentColor = rainbowColors[1];          } else if(i < 300) {              currentColor = rainbowColors[2];          } else if(i < 400) {              currentColor = rainbowColors[3];          } else if(i < 500) {              currentColor = rainbowColors[4];          } else if(i < 600) {              currentColor = rainbowColors[5];          } else if(i < 700) {              currentColor = rainbowColors[6];          }          // 當前顏色 R 分量          u_int8_t R = (currentColor & 0xFF0000) >> 16;          // 當前顏色 G 分量          u_int8_t G = (currentColor & 0x00FF00) >> 8;          // 當前顏色 B 分量          u_int8_t B = currentColor & 0x0000FF;          for (int j = 0; j < height; ++j) {              BMP_SetPixelRGB(bmp, j, i, R, G, B);          }      }        /* Save result */      BMP_WriteFile( bmp, "/Users/hubin/Desktop/test-qdbmp.bmp");      BMP_CHECK_ERROR( stderr, -2 );        /* Free all memory allocated for the image */      BMP_Free( bmp );      return 0;  }

easybmp(C++ 庫)

#include "EasyBMP/EasyBMP.h"  using namespace std;    // 彩虹的七種顏色  u_int32_t rainbowColors[] = {          0XFF0000, // 紅          0XFFA500, // 橙          0XFFFF00, // 黃          0X00FF00, // 綠          0X007FFF, // 青          0X0000FF, // 藍          0X8B00FF  // 紫  };    int main( int argc, char* argv[]) {        int width = 711, height = 711;      int bitDepth = 24;        BMP bmp;      bmp.SetSize(width, height);      bmp.SetBitDepth(bitDepth);        for (int i = 0; i < width; ++i) {          // 當前顏色          u_int32_t currentColor = rainbowColors[0];          if(i < 100) {              currentColor = rainbowColors[0];          } else if(i < 200) {              currentColor = rainbowColors[1];          } else if(i < 300) {              currentColor = rainbowColors[2];          } else if(i < 400) {              currentColor = rainbowColors[3];          } else if(i < 500) {              currentColor = rainbowColors[4];          } else if(i < 600) {              currentColor = rainbowColors[5];          } else if(i < 700) {              currentColor = rainbowColors[6];          }          // 當前顏色 R 分量          u_int8_t R = (currentColor & 0xFF0000) >> 16;          // 當前顏色 G 分量          u_int8_t G = (currentColor & 0x00FF00) >> 8;          // 當前顏色 B 分量          u_int8_t B = currentColor & 0x0000FF;            RGBApixel pixel;          pixel.Red = R;          pixel.Green = G;          pixel.Blue = B;          pixel.Alpha = 0;          for (int j = 0; j < height; ++j) {              bmp.SetPixel(j, i, pixel);          }      }        bmp.WriteToFile("/Users/hubin/Desktop/test-easybmp.bmp");        return 0;  }

bitmap(C++ 庫)

#include "bitmap/bitmap_image.hpp"    using namespace std;    // 彩虹的七種顏色  u_int32_t rainbowColors[] = {          0XFF0000, // 紅          0XFFA500, // 橙          0XFFFF00, // 黃          0X00FF00, // 綠          0X007FFF, // 青          0X0000FF, // 藍          0X8B00FF  // 紫  };    int main() {        int width = 711, height = 711;        bitmap_image image(width, height);      image.clear();        for (int i = 0; i < width; ++i) {          // 當前顏色          u_int32_t currentColor = rainbowColors[0];          if(i < 100) {              currentColor = rainbowColors[0];          } else if(i < 200) {              currentColor = rainbowColors[1];          } else if(i < 300) {              currentColor = rainbowColors[2];          } else if(i < 400) {              currentColor = rainbowColors[3];          } else if(i < 500) {              currentColor = rainbowColors[4];          } else if(i < 600) {              currentColor = rainbowColors[5];          } else if(i < 700) {              currentColor = rainbowColors[6];          }          // 當前顏色 R 分量          u_int8_t R = (currentColor & 0xFF0000) >> 16;          // 當前顏色 G 分量          u_int8_t G = (currentColor & 0x00FF00) >> 8;          // 當前顏色 B 分量          u_int8_t B = currentColor & 0x0000FF;            for (int j = 0; j < height; ++j) {              image.set_pixel(j, i, R, G, B);          }      }        image.save_image("/Users/hubin/Desktop/test-bitmap.bmp");        return 0;  }

查看開源庫的效果

六個開源庫都可以大大減少我們的工作量!

image-demo-rgb-to-bmp-library


程式碼:

rgb-to-bmp

參考資料:

libbmp

google libbmp

bmp

qdbmp

easybmp

bitmap

內容有誤?聯繫作者:

聯繫作者