Categories
Uncategorized

Audio and video entry–05-RGB-TO-BMP use open source library

* Audio and video how-to articles directories *

RGB-TO-BMP Review

The RGB data into BMP images:

    Learn BMP file format

    Ready BMP file header information

    Ready BMP header

    BMP is sequentially stored RGB B-G-R

    biHeight BitmapInfoHeader the field, biHeight is positive, the bitmap scanning from bottom to top, biHeight is negative, the bitmap top to bottom scan.

    BMP images four-byte alignment

The actual development process, often using a third party open source library to simplify development, to shield some of the underlying complexity, saving time to write a lot of code.

Use open source library of way

libbmp (C library)

#include 
#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 library)

#include 
#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 library)

#include 
#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 library)

#include 
#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 ++ Library)

#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 ++ Library)

#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;
}

See the effect of open source libraries

Six open source library can greatly reduce our workload!


Code:

rgb-to-bmp

References:

libbmp

google libbmp

bmp

qdbmp

easybmp

bitmap

Content is incorrect? Contact the author:


Leave a Reply