音視頻入門文章目錄 html
將 RGB 數據轉成 BMP 圖片:git
- 瞭解 BMP 文件格式
- 準備 BMP 文件頭信息
- 準備 BMP 信息頭
- BMP 存儲 RGB 的順序是 B-G-R
- BitmapInfoHeader 中的 biHeight 字段,biHeight 爲正,位圖自底向頂掃描,biHeight 爲負,位圖自頂向底掃描。
- BMP 圖像四字節對齊
實際開發過程,一般會使用第三方開源庫來簡化開發,屏蔽一些底層的複雜度,節省大量編寫代碼的時間。github
#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; }
#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; }
#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; }
#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; }
#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; }
#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; }
六個開源庫均可以大大減小咱們的工做量!segmentfault
代碼:ide
rgb-to-bmpgoogle
參考資料:spa
libbmp.net
google libbmpcode
bmp視頻
內容有誤?聯繫做者: