c ++从头开始制作位图的麻烦

时间:2014-09-24 07:52:21

标签: c++ winapi bitmap

我正在尝试从头开始制作位图。我有一个BYTE数组(已知大小)的RGB值,我想生成一个HBITMAP。

为了进一步说明,我使用的字节数组纯粹是RGB值。

我确保所有变量都设置正确,我相信这个问题与lpvBits有关。在过去的几天里,我一直在做这么多的研究,我找不到任何对我有用的东西。

出于测试目的width = 6height = 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;
}

2 个答案:

答案 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个字节。