像素格式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了像素格式相关的知识,希望对你有一定的参考价值。

参考技术A 介绍略

(YCrCb)是指将亮度参量Y和色度参量U/V分开表示的像素格式,主要用于优化彩色视频信号的传输。
YUV像素格式来源于RGB像素格式,通过公式运算,YUV三分量可以还原出RGB,YUV转RGB的公式如下

一般,将RGB和YUV的范围均限制在[0, 255]间,则有如下转换公式:

YUV相比于RGB格式最大的好处是可以做到在保持图像质量降低不明显的前提下,减小文件大小。YUV格式之所以能够做到,是因为进行了采样操作。

YUV码流的存储格式与其采样方式密切相关,主流的采样方式有三种:YUV4:4:4(YUV444),YUV4:2:2(YUV422),YUV4:2:0(YUV420)。

YUV4:4:4采样,每一个Y对应一组UV分量。
YUV4:2:2采样,每两个Y共用一组UV分量。
YUV4:2:0采样,每四个Y共用一组UV分量。

YUV存储可以分为两种:packed(打包)和planar(平面);
packed:Y、U、V分量穿插着排列,三个分量存在一个Byte型数组里;
planar:Y、U、V分量分别存在三个Byte型数组中;

这四种格式每一种又可以分为2类(packed和planar),以YUYV为例,一个6*4的图像的存储方式如下:

YUV420p: I420、YV12
YUV420sp: NV12、NV21
同样,对于一个6*4的图像,这四种像素格式的存储方式如下:

I420、YV12三个分量均为平面格式,即分别存在三个Byte型数组中;
NV12、NV21的存储格式为Y平面,UV打包,即Y信息存储在一个数组中,UV信息存储在一个矩阵中。

参考 https://blog.csdn.net/cgwang_1580/article/details/79595958

Win32 像素格式描述符学习

像素格式(PIXELFORMATDESCRIPTOR)明确了OpenGL绘制平面的特性,如象素缓冲区是单缓冲还是双缓冲,数据是 RGBA方式还是Color Index方式等。
每个OpenGL显示设备都支持一种指定的像素格式。一般用一个名为PIXELFORMATDESCRIPTOR的结构来表示某个特殊的像素格式,这个结构包含26个属性信息。Win32定义PIXELFORMATDESCRIPTOR如下所示:

typedef struct tagPIXELFORMATDESCRIPTOR
  
    WORD nSize;
    WORD nVersion;
    DWORD dwFlags;
    BYTE iPixelType;
    BYTE cColorBits;
    BYTE cRedBits;
    BYTE cRedShift;
    BYTE cGreenBits;
    BYTE cGreenShift;
    BYTE cBlueBits;
    BYTE cBlueShift;
    BYTE cAlphaBits;
    BYTE cAlphaShift;
    BYTE cAccumBits;
    BYTE cAccumRedBits;
    BYTE cAccumGreenBits;
    BYTE cAccumBlueBits;
    BYTE cAccumAlphaBits;
    BYTE cDepthBits;
    BYTE cStencilBits;
    BYTE cAuxBuffers;
    BYTE iLayerType;
    BYTE bReserved;
    DWORD dwLayerMask;
    DWORD dwVisibleMask;
    DWORD dwDamageMask;
   PIXELFORMATDESCRIPTOR;

前两个成员,结构体大小,版本;
第三个成员,多个标志 | 起来;
具体参阅:

https://docs.microsoft.com/en-us/previous-versions//ms537569(v=vs.85)?redirectedfrom=MSDN

bReserved只能设为0,
最后三个变量Windows 95都不支持,故全设置为0;

The PIXELFORMATDESCRIPTOR structure describes the pixel format of a drawing surface.
像素格式描述符结构体描述了一个绘图表面的像素格式。

iLayerType
Ignored. Earlier implementations of OpenGL used this member, but it is no longer used.
倒数第五个成员;早期OpenGL版本使用这个成员,它已不再使用;
 

VC++ 2012,新建一个单文档工程;

先初始化此结构体;把返回地址选择进设备描述表;然后才能进行后续的绘图;

看一下是否初始化成功;把相关返回值输出一下;

void CpixeltestView::OnDraw(CDC* pDC)

	CpixeltestDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if (!pDoc)
		return;

	// TODO: 在此处为本机数据添加绘制代码
	CDC*     pmyDC;
	CString  str1;

	PIXELFORMATDESCRIPTOR pfd =
	
		sizeof(PIXELFORMATDESCRIPTOR),
		1,
		PFD_DRAW_TO_WINDOW|
		PFD_SUPPORT_OPENGL|
		PFD_DOUBLEBUFFER,  
		PFD_TYPE_RGBA,
		24,
		0,0,0,0,0,0,
        0,0,0,0,0,0,0,
		32,
		0,0,
		PFD_MAIN_PLANE,
		0,
		0,0,0
	;
	str1.Format(_T("%x"), pfd);
	pDC->TextOutW(50, 50, str1);
     
    pmyDC = new CClientDC(this);
	int pixelFormat = ChoosePixelFormat(pmyDC->GetSafeHdc(), &pfd);
	str1.Format(_T("%x"), pmyDC);
	pDC->TextOutW(50, 80, str1);
	str1.Format(_T("%d"), pixelFormat);
	pDC->TextOutW(50, 110, str1);

运行如下;

 

以上是关于像素格式的主要内容,如果未能解决你的问题,请参考以下文章

高像素为啥要用RAW格式输出

lcd中像素深度bpp和像素格式(比如RGB,YUV)的关系

FFmpeg基础: YUV像素格式介绍和使用

FreeType像素格式博文汇总

RGB格式详解---RGB像素格式

FreeType像素格式:MONO