我正在尝试从头开始制作位图。我有一个BYTE
数组(已知大小)的RGB值,我想生成一个HBITMAP。
为了进一步说明,我使用的字节数组纯粹是RGB值。
我确保所有变量都设置正确,我相信这个问题与lpvBits
有关。在过去的几天里,我一直在做这么多的研究,我找不到任何对我有用的东西。
出于测试目的width = 6
和height = 1
代码:
HBITMAP RayTracing::getBitmap(void){
BYTE * bytes = getPixels();
void * lpvBits = (void *)bytes;
HBITMAP hBMP = CreateBitmap(width, height, 1, 24, lpvBits);
return hBMP;
}
BYTE * RayTracing::getPixels(void){
Vec3 * vecs = display.getPixels();
BYTE * bytes;
bytes = new BYTE[(3 * width * height)];
for (unsigned int i = 0; i < (width * height); i++){
*bytes = static_cast<BYTE>(vecs->x);
bytes++;
*bytes = static_cast<BYTE>(vecs->y);
bytes++;
*bytes = static_cast<BYTE>(vecs->z);
bytes++;
vecs++;
}
return bytes;
}
答案 0 :(得分:1)
你需要正确地对齐你的数组,这样每一行都是4个字节的偶数倍,然后在填充数组时跳过这些字节:
HBITMAP RayTracing::getBitmap(void)
{
BYTE * bytes = getPixels();
HBITMAP hBMP = CreateBitmap(width, height, 1, 24, bytes);
delete[] bytes;
return hBMP;
}
BYTE * RayTracing::getPixels(void)
{
Vec3 * vecs = display.getPixels(); // <-- don't forget to free if needed
int linesize = ((3 * width) + 3) & ~3; // <- 24bit pixels, width number of pixels, rounded to nearest dword boundary
BYTE * bytes = new BYTE[linesize * height];
for (unsigned int y = 0; y < height; y++)
{
BYTE *line = &bytes[linesize*y];
Vec3 *vec = &vecs[width*y];
for (unsigned int x = 0; x < width; x++)
{
*line++ = static_cast<BYTE>(vec->x);
*line++ = static_cast<BYTE>(vec->y);
*line++ = static_cast<BYTE>(vec->z);
++vec;
}
}
return bytes;
}
答案 1 :(得分:-1)
CreateBitmap的第三个参数应为3,而不是1.有三个颜色平面:红色,绿色和蓝色。
此外,如果将高度设置为大于1的任何值,则需要用零填充每行像素以使宽度为4的倍数。因此对于6x2图像,在保存6 * 3字节后对于第一行,您需要保存两个零字节以使该行长20个字节。