遇到C ++ Bitmaps问题

时间:2017-03-28 07:31:32

标签: c++ bitmap bmp

我正在尝试生成能够生成1像素设置为黑色的图像的代码,问题是当我尝试将单个像素设置为黑色时,输出是8个水平像素的黑色。我还试图将上面的像素设置为黑色,但它产生的水平线比原始像素高8个像素。

所以我的问题是,如何更改我的代码,以便最终在图像中使用位而不是字节?我只是希望能够将单个像素设置为黑色而不是像素字节。

这是我的代码:

#include <iostream>
#include <fstream>
#include "windows.h"
using namespace std;

#define IMAGE_SIZE 256
int main(int argc, char* argv[])
{

    BITMAPFILEHEADER bmfh;

    BITMAPINFOHEADER bmih;

    char colorTable[8] = { 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff };

    char bits[IMAGE_SIZE][IMAGE_SIZE];

    ofstream bmpOut("foo.bmp", ios::out + ios::binary);
    if (!bmpOut) {
        cout << "could not open file.";
        return -1;
    }
    bmfh.bfType = 0x4d42;
    bmfh.bfReserved1 = 0;
    bmfh.bfReserved2 = 0;
    bmfh.bfOffBits = sizeof(bmfh) + sizeof(bmih) + sizeof(colorTable);
    bmfh.bfSize = bmfh.bfOffBits + sizeof(bits);

    bmih.biSize = 40;
    bmih.biWidth = IMAGE_SIZE;
    bmih.biHeight = IMAGE_SIZE;
    bmih.biPlanes = 1;
    bmih.biBitCount = 1;
    bmih.biCompression = 0;
    bmih.biSizeImage = 0;
    bmih.biXPelsPerMeter = 2835; 
    bmih.biYPelsPerMeter = 2835;
    bmih.biClrUsed = 0;
    bmih.biClrImportant = 0;

    // Here I am initializing a white background for the bitmap image

    for (int i = 0; i < IMAGE_SIZE; i++) {
        for (int j = 0; j < IMAGE_SIZE; j++) {
            bits[i][j] = 255;
        }
    }

    // Here I attempt to set the most bottom left pixel to black and the pixel above it to black as well

    bits[0][0] = 0;

    bits[1][0] = 0;

    char* workPtr;
    workPtr = (char*)&bmfh;
    bmpOut.write(workPtr, 14);
    workPtr = (char*)&bmih;
    bmpOut.write(workPtr, 40);
    workPtr = &colorTable[0];
    bmpOut.write(workPtr, 8);
    workPtr = &bits[0][0];
    bmpOut.write(workPtr, IMAGE_SIZE*IMAGE_SIZE);
    bmpOut.close();

    system("mspaint foo.bmp");

    return 0;
}

以下是生成的位图图像的链接: Scaled up for clarity

由于

1 个答案:

答案 0 :(得分:0)

基于BITMAPINFOHEADER documentation,您似乎通过设置bmih.biBitCount = 1将您的位图设置为单色。这样,每个像素由一位(仅黑色或白色)表示,而不是字节。因此,要将左下角像素设置为黑色,需要执行bits[0][0] = 127(127 = 0x7F = 01111111b)。要在它上面设置一个,我认为你需要做bits[1][0] = 127。在这种情况下,我也相信

char bits[IMAGE_SIZE][IMAGE_SIZE/8];
...
for (int i = 0; i < IMAGE_SIZE; i++) {
    for (int j = 0; j < IMAGE_SIZE/8; j++) {
        bits[i][j] = 255;
    }
}
...
workPtr = &bits[0][0];
bmpOut.write(workPtr, IMAGE_SIZE*(IMAGE_SIZE/8));

就够了。

如果您打算使用不同的调色板,则应设置不同的biBitCount,如我在开头链接到的文档中所述,我想您希望bmih.biBitCount = 8作为您的健康默认值代码。