19,468
社区成员
发帖
与我相关
我的任务
分享
size_t width = bmp.bmWidth;
size_t height = bmp.bmHeight;
size_t size = width * height;
COLORREF *pixels = new COLORREF[size];
for (size_t i = 0; i < height; i++)
{
for (size_t j = 0; j < width; j++)
{
pixels[i * width + j] = GetPixel(dest_hdc,j, i);
}
}
delete[] data;
data = NULL;
data = new byte[size * 3 / 2]; // yuv格式数组大小,y亮度占len长度,u,v各占len/4长度。
int y, u, v;
for (size_t i = 0; i < height; i++)
{
for (size_t j = 0; j < width; j++)
{
// 屏蔽ARGB的透明度值
int rgb = pixels[i * width + j] & 0x00FFFFFF;
// 像素的颜色顺序为bgr,移位运算。
int r = rgb & 0xFF;
int g = (rgb >> 8) & 0xFF;
int b = (rgb >> 16) & 0xFF;
// 套用公式
y = ((66 * r + 129 * g + 25 * b + 128) >> 8) + 16;
u = ((-38 * r - 74 * g + 112 * b + 128) >> 8) + 128;
v = ((112 * r - 94 * g - 18 * b + 128) >> 8) + 128;
y = y < 16 ? 16 : (y > 255 ? 255 : y);
u = u < 0 ? 0 : (u > 255 ? 255 : u);
v = v < 0 ? 0 : (v > 255 ? 255 : v);
// 赋值
data[i * width + j] = (byte)y;
data[size + (i >> 1) * width + (j & ~1) + 0] = (byte)u;
data[size + (i >> 1) * width + (j & ~1) + 1] = (byte)v;
}
}
delete[] pixels;
你问题怎么解决的呢?