我解码H264的数据后得到rgb565的数据,保存一帧、一帧的位图成功。但是贴图就失败,贴出来全是黑快。求高人指点下?下面贴代码!

theheroonline theheroonline 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区

//网上找的代码
//rgb2bmp.h文件

#include <stdio.h>

typedef unsigned char BYTE;

typedef unsigned short WORD;

// BMP图像各部分说明如下

/***********

第一部分 位图文件头

该结构的长度是固定的,为14个字节,各个域的依次如下:

2byte :文件类型,必须是0x4d42,即字符串"BM"。

4byte :整个文件大小

4byte :保留字,为0

4byte :从文件头到实际的位图图像数据的偏移字节数。

*************/

typedef struct

{ long imageSize;

long blank;

long startPosition;

}BmpHead;

/*********************

/*********************

第二部分 位图信息头

该结构的长度也是固定的,为40个字节,各个域的依次说明如下:

4byte :本结构的长度,值为40

4byte :图像的宽度是多少象素。

4byte :图像的高度是多少象素。

2Byte :必须是1。

2Byte :表示颜色时用到的位数,常用的值为1(黑白二色图)、4(16色图)、8(256色图)、24(真彩色图)。

4byte :指定位图是否压缩,有效值为BI_RGB,BI_RLE8,BI_RLE4,BI_BITFIELDS。Windows位图可采用RLE4和RLE8的压缩格式,BI_RGB表示不压缩。

4byte :指定实际的位图图像数据占用的字节数,可用以下的公式计算出来:

图像数据 = Width' * Height * 表示每个象素颜色占用的byte数(即颜色位数/8,24bit图为3,256色为1)

要注意的是:上述公式中的biWidth'必须是4的整数倍(不是biWidth,而是大于或等于biWidth的最小4的整数倍)。

如果biCompression为BI_RGB,则该项可能为0。

4byte :目标设备的水平分辨率。

4byte :目标设备的垂直分辨率。

4byte :本图像实际用到的颜色数,如果该值为0,则用到的颜色数为2的(颜色位数)次幂,如颜色位数为8,2^8=256,即256色的位图

4byte :指定本图像中重要的颜色数,如果该值为0,则认为所有的颜色都是重要的。

***********************************/

typedef struct
{

long Length;

long width;

long height;

WORD colorPlane;

WORD bitColor;

long zipFormat;

long realSize;

long xPels;

long yPels;

long colorUse;

long colorImportant;

}InfoHead;

/***************************

/***************************

第三部分 调色盘结构 颜色表

对于256色BMP位图,颜色位数为8,需要2^8 = 256个调色盘;

对于24bitBMP位图,各象素RGB值直接保存在图像数据区,不需要调色盘,不存在调色盘区

rgbBlue: 该颜色的蓝色分量。

rgbGreen: 该颜色的绿色分量。

rgbRed: 该颜色的红色分量。

rgbReserved:保留值。

************************/

typedef struct

{ BYTE rgbBlue;

BYTE rgbGreen;

BYTE rgbRed;

BYTE rgbReserved;

/* void show(void)

{

printf("Mix Plate B,G,R:%d %d %dn",rgbBlue,rgbGreen,rgbRed);

}*/

}RGBMixPlate;

/****************************

RGB加上头部信息转换成BMP

参数說明:

rgb_buffer :RGB数据文件中的信息

nData :RGB数据的长度

nWidth :图像宽度的像素数

nHeight :图像高度的像素数

fp1 :所存放的文件

*****************************/

int RGB2BMP(char *rgb_buffer,int nWidth,int nHeight,FILE*fp1)

{

BmpHead m_BMPHeader;

char bfType[2]={'B','M'};

m_BMPHeader.imageSize=3*nWidth*nHeight+54;

m_BMPHeader.blank=0;

m_BMPHeader.startPosition=54;



fwrite(bfType,1,sizeof(bfType),fp1);

fwrite(&m_BMPHeader.imageSize,1,sizeof(m_BMPHeader.imageSize),fp1);

fwrite(&m_BMPHeader.blank,1,sizeof(m_BMPHeader.blank),fp1);

fwrite(&m_BMPHeader.startPosition,1,sizeof(m_BMPHeader.startPosition),fp1);



InfoHead m_BMPInfoHeader;

m_BMPInfoHeader.Length=40;

m_BMPInfoHeader.width=nWidth;

m_BMPInfoHeader.height=nHeight;

m_BMPInfoHeader.colorPlane=1;

m_BMPInfoHeader.bitColor=24;

m_BMPInfoHeader.zipFormat=0;

m_BMPInfoHeader.realSize=3*nWidth*nHeight;

m_BMPInfoHeader.xPels=0;

m_BMPInfoHeader.yPels=0;

m_BMPInfoHeader.colorUse=0;

m_BMPInfoHeader.colorImportant=0;



fwrite(&m_BMPInfoHeader.Length,1,sizeof(m_BMPInfoHeader.Length),fp1);

fwrite(&m_BMPInfoHeader.width,1,sizeof(m_BMPInfoHeader.width),fp1);

fwrite(&m_BMPInfoHeader.height,1,sizeof(m_BMPInfoHeader.height),fp1);

fwrite(&m_BMPInfoHeader.colorPlane,1,sizeof(m_BMPInfoHeader.colorPlane),fp1);

fwrite(&m_BMPInfoHeader.bitColor,1,sizeof(m_BMPInfoHeader.bitColor),fp1);

fwrite(&m_BMPInfoHeader.zipFormat,1,sizeof(m_BMPInfoHeader.zipFormat),fp1);

fwrite(&m_BMPInfoHeader.realSize,1,sizeof(m_BMPInfoHeader.realSize),fp1);

fwrite(&m_BMPInfoHeader.xPels,1,sizeof(m_BMPInfoHeader.xPels),fp1);

fwrite(&m_BMPInfoHeader.yPels,1,sizeof(m_BMPInfoHeader.yPels),fp1);

fwrite(&m_BMPInfoHeader.colorUse,1,sizeof(m_BMPInfoHeader.colorUse),fp1);

fwrite(&m_BMPInfoHeader.colorImportant,1,sizeof(m_BMPInfoHeader.colorImportant),fp1);

fwrite(rgb_buffer,3*nWidth*nHeight,1,fp1);

return 0;

}

pPic 是解码后的BUF,

void CHttpLinkDlg::showTest(char *pPic)
{
unsigned short* rgb_buffer =(unsigned short*)pPic;
int nWidth = m_width;
int nHeight = m_height;
long total = nWidth*nHeight*3;

long nData = nWidth*nHeight;
unsigned char* pVisit =(unsigned char*)malloc(total*sizeof(char));

unsigned char* tmp = pVisit;

long i =0;

unsigned char R,G,B;

while(i<nData)

{

R = *rgb_buffer&0x1f;

G = (*rgb_buffer>>5)&0x3f;

B = (*rgb_buffer>>11)&0x1f;

B = B<<3;

G = G<<2;

R = R<<3;

*pVisit=R;pVisit++;

*pVisit=G;pVisit++;

*pVisit=B;pVisit++;

rgb_buffer++;

i++;
}
/*********** write file *******************/
char newFile[50];
static int a445 = 0;
sprintf(newFile, "B_%04d.bmp", a445++);

FILE *result = fopen(newFile,"wb");

if (result == NULL)

{
return ;
}
RGB2BMP((char *)tmp,nWidth,nHeight,pPic);

fclose(result);
// 显示
// //PlayVideo((char *)tmp,nWidth,nHeight);
// HBITMAP hBmp = (HBITMAP)LoadImage( NULL ,newFile, IMAGE_BITMAP , 0 , 0 , LR_CREATEDIBSECTION | LR_LOADFROMFILE);
// if (hBmp != NULL){
// HDC hdc = ::GetDC(m_PlayWind.m_hWnd);
// HDC mdc = CreateCompatibleDC(hdc);
// HBITMAP hbmOld = (HBITMAP)::SelectObject(mdc,hBmp);
// BitBlt(hdc,0,0,nWidth,nHeight,mdc, 0, 0, SRCCOPY);
// //::SelectObject(mdc, hbmOld);
// ::DeleteDC(mdc);
// //delete [] bufRGBA;
// ::ReleaseDC(m_PlayWind.m_hWnd, hdc);
// }
}

这里保存图片正常,都保存成功了!下面是我贴图的代码,rgb_buffer解码后的buf和上面的showTest(char *pPic)函数里面处理过后的BUF都试过。
int CHttpLinkDlg::PlayVideo(char *rgb_buffer,int nWidth,int nHeight)
{
BITMAPINFO info;
memset(&info.bmiHeader, 0, sizeof(BITMAPINFOHEADER));
info.bmiHeader.biSize = sizeof( BITMAPINFOHEADER );
info.bmiHeader.biWidth = nWidth;
info.bmiHeader.biHeight = nHeight;
info.bmiHeader.biPlanes = 1;
info.bmiHeader.biBitCount = 16;
info.bmiHeader.biCompression = BI_BITFIELDS;
// info.bmiColors[0] = (BYTE)0xF800;
// info.bmiColors[1] = (BYTE)0x07E0;
// info.bmiColors[2] = (BYTE)0x001F;
HBITMAP hBitmap= CreateDIBSection(NULL, (BITMAPINFO*)&info, DIB_RGB_COLORS, (void**)&rgb_buffer, 0, 0);
if (hBitmap == NULL)
return -1;
HDC hdc = ::GetDC(m_PlayWind.m_hWnd);
HDC mdc = CreateCompatibleDC(hdc);
HBITMAP hbmOld = (HBITMAP)::SelectObject(mdc,hBitmap);
BitBlt(hdc,0,0,nWidth,nHeight,mdc, 0, 0, SRCCOPY);
::SelectObject(mdc, hbmOld);
::DeleteDC(mdc);
::ReleaseDC(m_PlayWind.m_hWnd, hdc);
return 0;
}

出来后黑屏。是在没法子了,求高手指点! 解码后的图片也不太正常,但有数据:
...全文

相关推荐

三相维也纳PFC整流器闭环仿真控制策略研究-中点电位平衡、无功补偿与双载波SVPWM(Simulink仿真实现)

内容概要:本文围绕三相维也纳PFC整流器的闭环仿真控制策略开展深入研究,重点聚焦中点电位平衡控制、无功功率补偿能力以及双载波SVPWM调制技术的集成与优化。通过Simulink平台构建30kW三相维也纳整流器的完整仿真模型,系统性地实现了基于零序电流注入法的中点电位主动平衡控制策略,有效抑制了直流侧中点电压偏移问题;同时设计了高性能的双闭环控制系统,实现了单位功率因数运行与无功功率的灵活动态调节。研究进一步引入双载波SVPWM调制技术(包含马鞍波与羊角波两种形式),提升了系统的电压利用率、调制效率及动态响应性能。全文涵盖了从主电路建模、控制算法设计、调制策略实现到仿真验证的全过程,为高效率、高功率密度的电力电子变换器系统设计提供了完整的理论依据与实践参考。; 适合人群:具备电力电子技术、自动控制理论及仿真建模基础,从事新能源发电、电力系统电能质量治理、工业自动化或电动汽车充电设施等相关领域研究的研发工程师与高校研究生。; 使用场景及目标:①深入掌握三相维也纳PFC整流器的工作机理与系统级控制架构设计;②学习并实现中点电位平衡、无功补偿等关键控制技术;③掌握双载波SVPWM调制策略的原理与仿真实现方法;④应用于新能源并网逆变器、储能变流器、高端电源等对电能质量和变换效率有严苛要求的电力变换系统开发与性能优化。; 阅读建议:建议结合Simulink仿真环境进行实践操作,重点关注控制器参数的整定过程、中点电位波动的抑制效果、无功指令的动态响应特性以及双载波调制波形的生成逻辑与频谱特性,应按照文中所述流程逐步搭建模型并调试,以深入理解各控制模块之间的耦合关系及系统的整体动态行为。

三伯

高校科研机构如何通过技术转移实现成果商业化?.docx

科易网基于40亿+科创知识图谱数据库,深度探索AI技术在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,研究科技创新领域的AI+数智化解决方案,推动科技创新与产业创新智能化发展。

BIZKEEN

技术转移机构如何筛选高潜力合作项目?.docx

技术转移机构如何筛选高潜力合作项目?

BIZKEEN

政府如何利用科技数据分析提升园区营商环境与产业规划的科学性?.docx

政府如何利用科技数据分析提升园区营商环境与产业规划的科学性?

BIZKEEN

QYR-23900-2026年全球数字身份智能卡行业总体规模、主要企业国内外市场占有率及排名 Sample-zj.docx

QYR-23900-2026年全球数字身份智能卡行业总体规模、主要企业国内外市场占有率及排名 Sample-zj.docx

qyresearch报告
评论 2
收藏 已收藏
分享
返回顶部
theheroonline
图形处理/算法 19,463 成员 50,678 内容