资源简介
本代码是博客文档bmp 转YUV420数据组 C语言实现的配套代码,

代码片段和文件信息
#include
#include
#include
#include
#include “bmp2dat.h“
#define true 1
#define false 0
unsigned char *buffer_dat = NULL;
unsigned char *rgbBuffer = NULL;
unsigned char *yBuffer = NULL;
unsigned char *uBuffer = NULL;
unsigned char *vBuffer = NULL;
static float RGBYUV02990[256] RGBYUV05870[256] RGBYUV01140[256];
static float RGBYUV01684[256] RGBYUV03316[256];
static float RGBYUV04187[256] RGBYUV00813[256];
char MakePalette(FILE* pFileBITMAPFILEHEADER *file_h
BITMAPINFOHEADER *info_h RGBQUAD *pRGB_out)
{
//先判断是否存在调色板:有效数据开始处离文件开头的距离-位图文件头大小-位图信息头大小=调色数据大小
if ((file_h->bfOffBits- sizeof(BITMAPFILEHEADER)-info_h->biSize)
== sizeof(RGBQUAD)*pow((float)2info_h->biBitCount))
{
fseek(pFilesizeof(BITMAPFILEHEADER)+info_h->biSize0);
//把调色数据放到pRGB_out中,完成make palette工作
if(fread(pRGB_out sizeof(RGBQUAD) (unsigned int)pow((float)2info_h->biBitCount)pFile)
!= (unsigned int)pow((float)2info_h->biBitCount))
{
printf(“Failto read RGBQUAD!\n“);
}
return true;
}
else
return false;
}
static void ReadRGB(FILE *pFile BITMAPFILEHEADER *file_h
BITMAPINFOHEADER *info_h unsigned char *rgbDataOut)
{
unsigned long Loop iLoop jLoop width height w h;
unsigned char mask *Index_Data *Data;
int shiftCnt;
unsigned char index ;
//保证是图像大小是4字节的整数倍,具体理由见下面的注释
if ((info_h->biWidth% 4) == 0)
w = info_h->biWidth;
else
w = (info_h->biWidth*info_h->biBitCount+ 31) / 32 * 4;
if ((info_h->biHeight% 2) == 0)
h = info_h->biHeight;
else
h = info_h->biHeight+ 1;
//若是24位,则bmp中有效数据大小是长*宽*3字节
//若是16位,则bmp中有效数据大小是长*宽*2字节
//若是8位,则bmp中有效数据大小是长*宽字节
//若是4位,则bmp中有效数据大小是长*宽/2字节
//若是2位,则bmp中有效数据大小是长*宽/4字节
//若是1位,则bmp中有效数据大小是长*宽/8字节(这大概是为什么bmp图像的长必须是4的倍数,宽必须是2的倍数的原因吧。。。)
width = (w/ 8)* info_h->biBitCount;
height = h;
//倒序前数据缓存区
Index_Data = (unsigned char*)malloc(height*width);//buffer大小应该与bmp中有效数据大小相同
//倒序后数据缓存区,用于存放bmp中的有效数
Data = (unsigned char*)malloc(height*width);//buffer大小应该与bmp中有效数据大小相同
//文件指针定位到有效数据起始处读取有效数据
fseek(pFilefile_h->bfOffBits0);
printf(“file_h->bfOffBits = %d \n“file_h->bfOffBits);
if(fread(Index_Data height*width 1 pFile) > height*width)
{
printf(“readfile error!“);
exit(0);
}
//倒序存放
for (iLoop= 0; iLoop < height; iLoop++)
{
for (jLoop= 0; jLoop < width; jLoop++)
{
Data[iLoop*width + jLoop] =Index_Data[(height - iLoop - 1)*width
+ jLoop];
}
}
//24位:直接把数据复制给输出缓存区
if (info_h->biBitCount== 24)
{
memcpy(rgbDataOutIndex_Data height*wid
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 16865 2018-07-04 16:42 bmp2dat.c
文件 1739 2018-07-04 15:57 bmp2dat.h
文件 381 2017-12-14 15:10 Makefile
----------- --------- ---------- ----- ----
18985 3
- 上一篇:基于Gabor特征的人脸识别
- 下一篇:C++ 几何运算源码
相关资源
- LINUX下命令行界面的C语言细胞游戏
- 尚观培训linux许巍老师关于c语言的课
- 《Linux程序设计》第四版pdf高清电子版
- linux 0.11内核代码
- linux ac108多麦方案驱动(ac108.c)
- 共享内存 读写
- 简易web服务器的设计与实现
- 《LINUX C编程从初学到精通》光盘源码
- Linux那些事儿之我是USB core
- Linux c语言 学生成绩管理系统
- Linux开发工具手册
- Linux操作系统下C语言编程从零开始
- 基于Linux下C语言开发的员工管理系统
- 超级玛丽c++源码win32Linux平台
- UNIX/LINUX下C语言中文短信UCS2编码和解
- 嵌入式工程师必知必会 (完整高清中
- linux-2.6.24.rar
- Linux下C语言操作静态ARP表,包括增加
- c语言 linux 贪吃蛇.doc
- Linux多线程服务端编程:使用muduo C+
- libstdc++.so.6.0.23_linux7
- libstdc++-devel-4.1.2-48.el5.x86_64
- C++版仿Linux文件管理系统
- 基于SDL的贪吃蛇游戏
- 链表栈的基本操作(C语言
- 基于linux C/C++和Qt的聊天程序
- Linux+gladeGTK++C语言+mysql的模仿QQ聊天工
- 嵌入式linuxC语言程序设计基础教程
- C Programming in Linux Linux下C语言
- Linux软件工程师(C语言)实用教程_
评论
共有 条评论