WEB开发网
开发学院软件开发VC RGB与YUV图像视频格式的相互转换 阅读

RGB与YUV图像视频格式的相互转换

 2007-08-29 21:35:09 来源:WEB开发网   
核心提示: RGB介绍:在记录计算机图像时,最常见的是采用RGB(红、绿,RGB与YUV图像视频格式的相互转换(2),蓝)颜色分量来保存颜色信息,例如非压缩的24位的BMP图像就采用RGB空间来保存图像,7,9….行),一个像素24位,每8位保存一种颜色强度(0-255)

RGB介绍:

在记录计算机图像时,最常见的是采用RGB(红、绿,蓝)颜色分量来保存颜色信息,例如非压缩的24位的BMP图像就采用RGB空间来保存图像。一个像素24位,每8位保存一种颜色强度(0-255),例如红色保存为 0xFF0000。

YUV介绍:

YUV是被欧洲电视系统所采用的一种颜色编码方法,我国广播电视也普遍采用这类方法。其中“Y”表示明亮度(Luminance或Luma),也就是灰阶值;而“U”和“V”表示的则是色度(Chrominance或Chroma)。彩色电视采用YUV空间正是为了用亮度信号Y解决彩色电视机与黑白电视机的兼容问题,使黑白电视机也能接收彩色电视信号。

隔行读取BMP:

下面我说明如何隔行读取BMP图像,为什么我以BMP图像来作演示,因为BMP可以说是最简单的一种图像格式,最容易用它说明原理,那公为什么要用BMP来演示隔行读取呢,因为要实现RGB转电视场制图像,首先就要知识如何隔行读取。

BMP图像颜色信息的保存顺序是由左到右,由下往上,您可以执行一下附带程序的 (功能菜单->读取RGB) 看到图像的读取和显示过程。代码首先依次显示奇数行像素,如(1,3,5,7,9….行),完成后再依次显示偶数行像素,代码实现如下:

// 隔行显示BMP
void CRGB2YUVView::OnReadBmp()
{
  // TODO: Add your command handler code here
  CDC *pDC = GetDC();
  
  CRect rect;
  CBrush brush(RGB(128,128,128));
  GetClientRect(&rect);
  pDC->FillRect(&rect, &brush);
  BITMAPFILEHEADER bmfh;
  BITMAPINFOHEADER bmih;
  char strFileName[MAX_PATH]="720bmp.bmp";
  CFile* f;
  f = new CFile();
  f->Open(strFileName, CFile::modeRead);
  f->SeekToBegin();
  f->Read(&bmfh, sizeof(bmfh));
  f->Read(&bmih, sizeof(bmih));
 
  // 分配图片像素内存
  RGBTRIPLE *rgb;
  rgb = new RGBTRIPLE[bmih.biWidth*bmih.biHeight];
  f->SeekToBegin();
  f->Seek(54,CFile::begin); // BMP 54个字节之后的是像素数据
  f->Read(rgb, bmih.biWidth * bmih.biHeight * 3);   // 这里只读24位RGB(r,g,b)图像
  
  // 显示上场 (奇数行组成的奇数场)
  for (int i = 0; i<bmih.biHeight; i++) {
    for (int j = 0; j<bmih.biWidth; j++) {
      if(!(i%2))
        pDC->SetPixel(j, bmih.biHeight-i,
         RGB(rgb[i*bmih.biWidth+j].rgbtRed,
         rgb[i*bmih.biWidth+j].rgbtGreen,rgb[i*bmih.biWidth+j].rgbtBlue));
      for (int k=0; k<1000; k++) ; //延时
    }
  }
  Sleep(500);
  // 显示下场 (偶数行组成的偶数场)
  for (int i_ = 0; i_<bmih.biHeight; i_++) {
    for (int j_ = 0; j_<bmih.biWidth; j_++) {
      if(i_%2)
        pDC->SetPixel(j_, bmih.biHeight-i_,
        RGB(rgb[i_*bmih.biWidth+j_].rgbtRed,
        rgb[i_*bmih.biWidth+j_].rgbtGreen,
        rgb[i_*bmih.biWidth+j_].rgbtBlue));
      for (int k=0; k<1000; k++) ; //延时
    }
  }
  // 显示24位BMP信息
  LONG dwWidth = bmih.biWidth;
  LONG dwHeight = bmih.biHeight;
  WORD wBitCount = bmih.biBitCount;
  char buffer[80];
  sprintf(buffer,"图像宽为:%ld 高为:%ld 像数位数:%d", dwWidth, dwHeight, wBitCount);
  MessageBox(buffer, "每个像素的位数", MB_OK | MB_ICONINFORMATION);
  
  f->Close();
  delete f;
  delete rgb;
}
RGB转YUV

上一页  1 2 3 4  下一页

Tags:RGB YUV 图像

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接