首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从零开始制作位图的c++问题

从零开始制作位图的c++问题
EN

Stack Overflow用户
提问于 2014-09-24 07:52:21
回答 2查看 1.3K关注 0票数 0

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

为了进一步澄清,我正在处理的字节数组纯粹是RGB值。

我已经确定了所有变量都是正确的,并且我相信这个问题与lpvBits有关。在过去的几天里,我一直在为这件事做同样多的研究,我一直找不到任何对我有意义的东西。

为了测试目的,width = 6height = 1

代码:

代码语言:javascript
复制
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;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-24 09:14:54

您需要正确地对齐数组,使每一行都是4个字节的偶数倍,然后在填充数组时跳过这些字节:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2014-09-24 08:26:04

CreateBitmap的第三个参数应该是3,而不是1。有三个颜色平面:红色、绿色和蓝色。

此外,如果将高度设置为大于1,则需要用零填充每行像素,使宽度乘以4。因此,对于6x2图像,在为第一行保存6*3字节后,需要保存两个零字节,使行长为20个字节。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26011437

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档