资源简介
本代码是博客文档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+Apache+Nginx+Mysql+PHP完美配置教程
- 文件系统c语言实现,在linux下编译
- linux下用C语言实现寻找1到1亿内的素数
- linux下C语言实现简易web服务器
- linux下C语言实现读者写者写者优先
- C语言编写简单聊天室
- 贪吃蛇 linux开发 C语言 linux系统编程
- 使用HackRF在windows和linux下扫描GSM频道
- 用线程实现睡觉的理发师问题linux实现
- 生产者消费者问题信号量linux实现代码
- linux环境下模拟实现简单命令解释器
- Linux下C语言编写服务端、客户端程序
- linux系统下C语言实现带有图形界面的
- mysql封装.zip
- Linux文件模拟器
- linux 下 python调用c或者c++编写的代码使
- 《嵌入式Linux上的C语言编程实践》
- linux opencv车牌识别
- 尚观教育李慧芹Linux下C语言前嵌入式
- 基于Linux C语言的多线程模拟智能家具
- p2p的C语言编写,LINUX可执行程序+运行
- linux命令c语言自己实现大概40来个
- linux下网络编程TCP客户端和服务器端数
- linux环境下C语言编程指南 源代码
- C/C++实现linux和Windows查看系统、进程、
- Linux GTK 聊天室 MySql C语言聊天室
- Linux 串口源代码纯C++
- udp 聊天室 基于linux c语言实现
- C语言实现Linux文件系统模拟文档内有
- linux下alsa架构采集声音成wav格式播放
评论
共有 条评论