BMP转YUV

1.BMP与YUV与RGB

BMP(全称 Bitmap)是 Windows 操作系统中的标准图像文件格式,可以分成两类:设备相关位图(DDB)和设备无关位图(DIB),使用广泛。它采用位映射存储格式,除了图像深度可选以外,在绝大多数应用中不采用其他任何压缩,因此,BMP 文件所占用的空间很大。BMP 文件的图像深度可选 lbit、4bit、8bit、16bit 及 24bit。BMP 文件存储数据时,图像的扫描方式是按从左到右、从下到上的顺序。由于 BMP 文件格式是 Windows 环境中交换与图有关的数据的一种标准,因此在 Windows 环境中运行的图形图像软件都支持 BMP 图像格式。

RGB:对一种颜色进行编码的方法统称为“颜色空间”或“色域”。用最简单的话说,世界上任何一种颜色的“颜色空间”都可定义成一台固定的数字或变量。RGB(红、绿、蓝)只是众多颜色空间的一种。采用这种编码方法,每种颜色都可用三个变量来表示-红色绿色以及蓝色的强度。 记录及显示彩色图像时,RGB是最常见的一种方案。但是,它缺乏与早期黑白显示系统的良好兼容性。

YUV:“YUV(Y'CbCr)是一种像素格式,常见于视频编码与静态图像。与RGB格式(红-绿-蓝)相反,YUV 分别由一个称为Y(相当于灰度)的“亮度”分量(Luminance or Luma)和两个称为U(蓝色投影Cb)和V(红色投影Cr)的“色度”分量(Chrominance or Chroma)表示,由此得名。”

2.Y=0.299R+0.587G+0.114B+16 Cr=V=0.500R−0.419G−0.081B+128 Cb=U=−0.169R−0.331G+0.500B+128

3.实验补充

典型的BMP图像文件由四部分组成:(1)位图头文件数据结构,它包含BMP图像文件的类型、显示内容等信息;(2)位图信息数据结构,它包含有BMP图像的宽、高、压缩方法,以及定义颜色等信息;(3)调色板,这个部分是可选的,有些位图需要调色板,有些位图,比如真彩色图(24位的BMP)就不需要调色板;(4)位图数据,这部分的内容根据BMP位图使用的位数不同而不同,在24位图中直接使用RGB,而其他的小于24位的使用调色板中颜色索引值。相应的数据结构可表示如下:位图文件头主要包括:typedef struct tagBITMAPFILEHEADER {

2WORD bfType; /* 说明文件的类型*/DWORD bfSize;/* 说明文件的大小,用字节为单位*/WORD bfReserved1; /* 保留,设置为0 */WORD bfReserved2; /* 保留,设置为0 */DWORD bfOffBits; /* 说明从BITMAPFILEHEADER结构开始到实际的图像数据之间的字节偏移量*/} BITMAPFILEHEADER;(2) 位图信息头主要包括:typedef struct tagBITMAPINFOHEADER {DWORD biSize; /* 说明结构体所需字节数*/LONG biWidth; /* 以像素为单位说明图像的宽度*/LONG biHeight; /* 以像素为单位

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一段简单的 Linux 下 BMP YUV420 的 C 语言代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define BMP_HEADER_SIZE 54 void bmp_to_yuv420(char *bmp_file, char *yuv_file, int width, int height) { FILE *bmp_fp = fopen(bmp_file, "rb"); if (bmp_fp == NULL) { printf("Failed to open BMP file.\n"); return; } FILE *yuv_fp = fopen(yuv_file, "wb"); if (yuv_fp == NULL) { printf("Failed to create YUV file.\n"); fclose(bmp_fp); return; } // BMP header unsigned char bmp_header[BMP_HEADER_SIZE]; fread(bmp_header, sizeof(unsigned char), BMP_HEADER_SIZE, bmp_fp); // Image data int image_size = width * height * 3; unsigned char *image_data = (unsigned char *)malloc(image_size * sizeof(unsigned char)); fread(image_data, sizeof(unsigned char), image_size, bmp_fp); // YUV data int y_size = width * height; int u_size = y_size / 4; int v_size = y_size / 4; unsigned char *yuv_data = (unsigned char *)malloc((y_size + u_size + v_size) * sizeof(unsigned char)); // Convert BMP to YUV int i, j, k, l; for (i = 0; i < height; i++) { for (j = 0; j < width; j++) { int index = i * width + j; int y_index = i * width + j; int u_index = (i / 2) * (width / 2) + (j / 2) + y_size; int v_index = (i / 2) * (width / 2) + (j / 2) + y_size + u_size; unsigned char r = image_data[index * 3]; unsigned char g = image_data[index * 3 + 1]; unsigned char b = image_data[index * 3 + 2]; // Y component yuv_data[y_index] = (unsigned char)(0.299 * r + 0.587 * g + 0.114 * b); // U component if (i % 2 == 0 && j % 2 == 0) { int u_sum = 0; for (k = i; k < i + 2; k++) { for (l = j; l < j + 2; l++) { int u_index = (k / 2) * (width / 2) + (l / 2) + y_size; u_sum += image_data[(k * width + l) * 3 + 1]; } } yuv_data[u_index] = (unsigned char)(u_sum / 4); } // V component if (i % 2 == 0 && j % 2 == 0) { int v_sum = 0; for (k = i; k < i + 2; k++) { for (l = j; l < j + 2; l++) { int v_index = (k / 2) * (width / 2) + (l / 2) + y_size + u_size; v_sum += image_data[(k * width + l) * 3 + 2]; } } yuv_data[v_index] = (unsigned char)(v_sum / 4); } } } // Write YUV file fwrite(yuv_data, sizeof(unsigned char), y_size + u_size + v_size, yuv_fp); // Cleanup free(image_data); free(yuv_data); fclose(bmp_fp); fclose(yuv_fp); } int main() { bmp_to_yuv420("input.bmp", "output.yuv", 640, 480); return 0; } ``` 这段代码会将输入的 BMP 文件换为 YUV420 格式,并将结果保存到指定的 YUV 文件中。需要注意的是,这段代码仅适用于 24 位真彩色 BMP 图像。如果要处理其他类型的 BMP 图像,需要对代码进行适当的修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值