【发布时间】:2014-09-24 17:14:54
【问题描述】:
我正在尝试从头开始制作位图。我有一个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;
}
【问题讨论】:
-
那么您预计会发生什么以及实际发生了什么?
-
我正在尝试显示 HBITMAP,但没有任何显示,也没有错误。
-
您是否对扫描线进行了字对齐? msdn.microsoft.com/en-us/library/dd183485(v=vs.85).aspx
-
@Deduplicator 我很难理解字对齐原始像素的含义
-
@MichaelMitchell:为每行像素分配的空间必须是 2 个字节的偶数倍。您正在创建 24 位位图。假设
width为 1。每条扫描线需要 3 个字节的像素数据和 1 个填充字节,因此您必须为数组分配(3+1)*height字节。如果width为 2,则每条扫描线将需要 6 个字节,这是对齐的,因此数组将需要6*height字节,依此类推。分配数组时,将width乘以bits/8并四舍五入到 2 的下一个最高倍数,并确保在用像素填充数组时考虑该填充