根据问题中的Microsoft链接提供的信息:
for (int i = 0; i < width/2; ++i)
{
int y0 = ptrIn[0];
int u0 = ptrIn[1];
int y1 = ptrIn[2];
int v0 = ptrIn[3];
ptrIn += 4;
int c = y0 - 16;
int d = u0 - 128;
int e = v0 - 128;
ptrOut[0] = clip(( 298 * c + 516 * d + 128) >> 8); // blue
ptrOut[1] = clip(( 298 * c - 100 * d - 208 * e + 128) >> 8); // green
ptrOut[2] = clip(( 298 * c + 409 * e + 128) >> 8); // red
c = y1 - 16;
ptrOut[3] = clip(( 298 * c + 516 * d + 128) >> 8); // blue
ptrOut[4] = clip(( 298 * c - 100 * d - 208 * e + 128) >> 8); // green
ptrOut[5] = clip(( 298 * c + 409 * e + 128) >> 8); // red
ptrOut += 6;
}
vector
,例如 vector<unsigned char> buffer(width*height*3); ptrOut = &buffer[0];
。至于如何保存到文件,已经在其他地方得到了回答,例如:https://dev59.com/YHE85IYBdhLWcg3wr1ux - Mark Ransomint C = luma - 16;
int D = cr - 128;
int E = cb - 128;
r = (298*C+409*E+128)/256;
g = (298*C-100*D-208*E+128)/256;
b = (298*C+516*D+128)/256;
我从Matlab的一个例子中得到了这个。
需要注意的是:在内存中,Windows位图不是RGB格式,而是BGR格式。如果您要写入内存缓冲区,您需要进行如下操作:
rgbbuffer[rgbindex] = (char)b;
rgbbuffer[rgbindex + 1] = (char)g;
rgbbuffer[rgbindex + 2] = (char)r;
Y
称为亮度(Luma),U
称为蓝色色差(Cb),V
称为红色色差(Cr)。 - Maghoumi