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)
将整个文件读入内存.前面会有一个小标题,其余部分将是像素值.
第一部分是BITMAPFILEHEADER
结构.您唯一关心的部分是bfOffBits,它提供从文件开头到像素值的字节数.
接下来的部分BITMAPFILEHEADER
将是一个BITMAPINFOHEADER
.这对于确定像素的格式很有用.
如果位深度需要一个,则后面会有一个调色板.
像素值有几个问题.首先是订单是(蓝色,绿色,红色),正好与其他人一样.其次是行从图像的底部到顶部,再次从其他人向后.最后,一行中的字节数将始终填充到4的下一个倍数.
我几乎忘了提到,JPEG或PNG文件可能被编码为BMP,但这并不常见.看看biCompression字段BITMAPINFOHEADER
,如果除了BI_RGB之外你还需要更多的帮助.
归档时间: |
|
查看次数: |
43857 次 |
最近记录: |