ffmpeg 转 RGB 填充 bitmap

使用ffmpeg的sws_scale函数将视频帧转换为RGB格式,并通过CreateBmp函数创建Bitmap文件。在创建BMP文件时,注意Bitmap的图像高度需要设置为负值,以正确显示图像。问题在于bmpinfo.bmiHeader.biHeight应设置为-height,因为BMP格式的图像数据是从下到上存储的。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

sws_scale( img_convert_ctx, 
          pVideoFrame[nChannel]->data, 
  pVideoFrame[nChannel]->linesize, 
                          0, 
  pCodeContext[nChannel]->height, 
  pRGBFrame->data, 
  pRGBFrame->linesize); 

CreateBmp(szFileName, pRGBFrame->data[0], 
            pCodeContext[nChannel]->width, 
pCodeContext[nChannel]->height, 
24) 

BOOL CreateBmp(char *filename, uint8_t *pRGBBuffer, int width, int height, int bpp) 

BITMAPFILEHEADER bmpheader; 
BITMAPINFO bmpinfo; 
FILE *fp = NULL; 

fp = fopen(filename,"wb"); 
if( fp == NULL ) 

return FALSE; 


bmpheader.bfType = ('M' < <8)|'B'; 
bmpheader.bfReserved1 = 0; 
bmpheader.bfReserved2 = 0; 
bmpheader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); 
bmpheader.bfSize = bmpheader.bfOffBits + width*height*bpp/8; 

bmpinfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); 
bmpinfo.bmiHeader.biWidth = width; 
bmpinfo.bmiHeader.biHeight = height; 
bmpinfo.bmiHeader.biPlanes = 1; 
bmpinfo.bmiHeader.biBitCount = bpp; 
bmpinfo.bmiHeader.biCompression = BI_RGB; 
bmpinfo.bmiHeader.biSizeImage = 0; 
bmpinfo.bmiHeader.biXPelsPerMeter = 100; 
bmpinfo.bmiHeader.biYPelsPerMeter = 100; 
bmpinfo.bmiHeader.biClrUsed = 0; 
bmpinfo.bmiHeader.biClrImportant = 0; 

fwrite(&bmpheader,sizeof(BITMAPFILEHEADER),1,fp); 
fwrite(&bmpinfo.bmiHeader,sizeof(BITMAPINFOHEADER),1,fp); 
fwrite(pRGBBuffer,width*height*bpp/8,1,fp); 
fclose(fp); 
fp = NULL; 

return TRUE; 


这个问题第1个回答:
bmpinfo.bmiHeader.biHeight = -height;
这个问题第2个回答:
倒立才是对的,bmp的图象数据是从下至上的 
C#中,要显示YUV(通常用于视频编码,其中Y代表亮度,U和V代表色度)图片,首先需要将YUV数据转换成适合计算机图形系统显示的颜色空间,如RGB。这里简单概述一下步骤: 1. **YUV数据读取**:从文件或内存获取YUV图像的数据,通常会是一个字节流,每个像素由三个分量(Y, U, V)组成。 2. **解码**:如果你有YUV到RGB的预定义公式或库函数,例如NVidia的CUDA API或FFmpeg等,按照合适的算法将YUV数据转换RGB。 3. **创建Bitmap对象**:在.NET Framework中,可以使用`System.Drawing.Bitmap`类来创建一个新的位图对象,准备存放转换后的RGB图像数据。 4. **填充像素**:遍历解码后的RGB数据,逐像素地设置Bitmap对象的色彩信息。 5. **显示图像**:可以使用`pictureBox`控件、`Graphics`对象或者`WriteableBitmap`等方法将Bitmap对象显示在窗体上。 6. **内存管理**:确保在完成显示后释放临时存储的YUV和RGB数据,避免内存泄漏。 以下是简化的示例代码片段(假设已经有一个名为`DecodeYUVToRGB`的函数进行实际的YUV解码): ```csharp using System.Drawing; using System.Drawing.Imaging; public void DisplayYUVImage(byte[] yuvData, int width, int height) { // 解码YUV数据 byte[] rgbData = DecodeYUVToRGB(yuvData, width, height); // 创建Bitmap Bitmap bitmap = new Bitmap(width, height); using (var graphics = Graphics.FromImage(bitmap)) { // 将RGB数据写入Bitmap for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { Color color = Color.FromArgb(rgbData[(y * width + x) * 3], // BGR -> RGB顺序调整 rgbData[(y * width + x) * 3 + 1], rgbData[(y * width + x) * 3 + 2]); bitmap.SetPixel(x, y, color); } } // 显示Bitmap pictureBox.Image = bitmap; } } // ... 使用适当的方式调用DisplayYUVImage方法 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值