BMP文件行填充问题 [英] BMP File line padding issue

查看:188
本文介绍了BMP文件行填充问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

所以我试图导出一个.bmp文件在C ++代码,我有它的工作,除了一个主要的事情:线填充。我不是100%肯定如何行填充工作,但我知道我需要它。我的算法工作除了填充,我手动添加填充十六进制编辑器到我导出的图像和它的工作。但是如何添加填充?这里是我有:

So I'm trying to export a .bmp file in C++ code, and I have it working except for one major thing: line padding. I'm not 100% sure on how line padding works, but I know I need it. My algorithm works except for the padding, I manually added padding in a hex editor to my exported image and it worked. But how do I add padding? Here is what I have:

//Size of the file in bytes
    int fileSize = 54 + (3 * width * height);

    //The sections of the file
    unsigned char generalHeader[14] = {'B','M',0,0, 0,0,0,0, 0,0,54,0, 0,0};
    unsigned char DIBHeader[40]     = {40,0,0,0, 0,0,0,0, 0,0,0,0, 1,0,24,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0};
    unsigned char pixelArray[1000000];
    unsigned char bmpPad[3] = {0, 0, 0};

    //Set the binary portion of the generalHeader, mainly just file size
    generalHeader[2] = (unsigned char)(fileSize);
    generalHeader[3] = (unsigned char)(fileSize >> 8);
    generalHeader[4] = (unsigned char)(fileSize >> 16);
    generalHeader[5] = (unsigned char)(fileSize >> 24);

    //The binary variable portion of the DIB header
    DIBHeader[4]  = (unsigned char)(width);
    DIBHeader[5]  = (unsigned char)(width >> 8);
    DIBHeader[6]  = (unsigned char)(width >> 16);
    DIBHeader[7]  = (unsigned char)(width >> 24);
    DIBHeader[8]  = (unsigned char)(height);
    DIBHeader[9]  = (unsigned char)(height >> 8);
    DIBHeader[10] = (unsigned char)(height >> 16);
    DIBHeader[11] = (unsigned char)(height >> 24);

    //Loop through all width and height places to add all pixels


    int counter = 0;
    for(short j = height; j >= 0; j--)
    {
        for(short i = 0; i < width; i++)
        {
            //Add all 3 RGB values
            pixelArray[counter] = pixelColour[i][j].red;
            pixelArray[counter] = pixelColour[i][j].green;
            pixelArray[counter] = pixelColour[i][j].blue;
            counter++;
        }
    }

    //Open it
    ofstream fileWorking(fileName);

    //Write the sections
    fileWorking.write((const char*)generalHeader, 14);
    fileWorking.write((const char*)DIBHeader, 40);
    fileWorking.write((const char*)pixelArray, 3 * width * height);

    //NO MEMORY LEAKS 4 ME
    fileWorking.close();

pixelColour是具有3种颜色的struct数据类型,所有类型都是unsigned char。非常感谢任何帮助。

pixelColour is of struct data type with the 3 colours, all type unsigned char. Any help is greatly appreciated!

推荐答案

在您的情况下,每一行必须是4个字节(32位)的倍数。

In your case, each row must be a multiple of 4 bytes (32 bits).

int pad = 0; // Set pad byte count per row to zero by default.
// Each row needs to be a multiple of 4 bytes.  
if ((width * 3) % 4 != 0) pad = 4 - ((width * 3) % 4); // 4 - remainder(width * 3 / 4).

填充值可以包含几乎任何内容,但最好将其设置为0.写入每行的结束,只需在写下一行之前写一个额外的 pad 数字(字节)。

Padding values can contain pretty much anything, but it is best to set them to 0. When you reach the end of writing each row, just write an additional pad number of zeroes (bytes) before writing the next row.

for(short j = height; j >= 0; j--) {
    for(short i = 0; i < width; i++) {
        //Add all 3 RGB values
        pixelArray[counter++] = pixelColour[i][j].red; // Need to advance counter.
        pixelArray[counter++] = pixelColour[i][j].green;
        pixelArray[counter++] = pixelColour[i][j].blue;
    }
    for (int padVal = 0; padVal < pad; padVal++) pixelArray[counter++] = 0; // Pad.
}

最后,您需要写一个更大的文件:

Finally, you need to write a larger file size:

fileWorking.write((const char*) pixelArray, (3 * width + pad) * height);

这篇关于BMP文件行填充问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆