音視頻入門-05-RGB-TO-BMP使用開源庫

音視頻入門文章目錄

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

內容有誤?聯繫作者:

聯繫作者


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章