• 音视频入门-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

    内容有误?联系作者:

    联系作者


  • 相关阅读:
    获取comboBox里面的item使用的方法
    QT格式化代码
    按键槽的写法
    int to String
    sprintf在51单片机中的使用
    学习使用MarkDown
    分享9款超酷的jQuery/CSS3插件
    2014年展望
    操作系统面试
    web一点小结
  • 原文地址:https://www.cnblogs.com/binglingziyu/p/audio-video-basic-05-rgb-to-bmp-library.html
Copyright © 2020-2023  润新知