• 大小: 6KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-05-19
  • 语言: C/C++
  • 标签: bmp转yuv  linux  

资源简介

本代码是博客文档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


评论

共有 条评论