如何将BMP像素值读入数组?

Car*_*nko 9 c++ windows image bmp

我正在用C++编写代码(在Windows上),我正在尝试提取灰度级bmp的像素值.我不关心保留任何元数据,只想将像素值存储在char数组中.我无法找到手动执行此操作的标准或"典型"方式,因此我想知道是否有一个简单的库可供人们用来将位图加载到内存中.

提前致谢!

Yol*_*ola 13

准备去代码,用g ++测试(不是Windows,但可以帮助某人):

#pragma pack(1)

#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

#include "bmp.h"

vector<char> buffer;
PBITMAPFILEHEADER file_header;
PBITMAPINFOHEADER info_header;

void fill() {
    std::ifstream file("data.bmp");

    if (file) {
        file.seekg(0,std::ios::end);
        streampos length = file.tellg();
        file.seekg(0,std::ios::beg);

        buffer.resize(length);
        file.read(&buffer[0],length);

        file_header = (PBITMAPFILEHEADER)(&buffer[0]);
        info_header = (PBITMAPINFOHEADER)(&buffer[0] + sizeof(BITMAPFILEHEADER));
    }
}

int main() {
    fill();

    cout << buffer[0] << buffer[1] << endl;
    cout << file_header->bfSize << endl;
    cout << info_header->biWidth << " " << info_header->biHeight << endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在bmp.hi中定义了结构:

#pragma once

typedef int LONG;
typedef unsigned short WORD;
typedef unsigned int DWORD;

typedef struct tagBITMAPFILEHEADER {
  WORD  bfType;
  DWORD bfSize;
  WORD  bfReserved1;
  WORD  bfReserved2;
  DWORD bfOffBits;
} BITMAPFILEHEADER, *PBITMAPFILEHEADER;

typedef struct tagBITMAPINFOHEADER {
  DWORD biSize;
  LONG  biWidth;
  LONG  biHeight;
  WORD  biPlanes;
  WORD  biBitCount;
  DWORD biCompression;
  DWORD biSizeImage;
  LONG  biXPelsPerMeter;
  LONG  biYPelsPerMeter;
  DWORD biClrUsed;
  DWORD biClrImportant;
} BITMAPINFOHEADER, *PBITMAPINFOHEADER;
Run Code Online (Sandbox Code Playgroud)

  • 我还认为OP想要一个像素颜色数组,而不是所有文件字节的数组. (2认同)

Mar*_*som 5

将整个文件读入内存.前面会有一个小标题,其余部分将是像素值.

第一部分是BITMAPFILEHEADER结构.您唯一关心的部分是bfOffBits,它提供从文件开头到像素值的字节数.

接下来的部分BITMAPFILEHEADER将是一个BITMAPINFOHEADER.这对于确定像素的格式很有用.

如果位深度需要一个,则后面会有一个调色板.

像素值有几个问题.首先是订单是(蓝色,绿色,红色),正好与其他人一样.其次是行从图像的底部到顶部,再次从其他人向后.最后,一行中的字节数将始终填充到4的下一个倍数.

我几乎忘了提到,JPEG或PNG文件可能被编码为BMP,但这并不常见.看看biCompression字段BITMAPINFOHEADER,如果除了BI_RGB之外你还需要更多的帮助.