2个回答
展开全部
你首先需要了解bmp文件的文件结构。 1)前面14个字节是 文件头 ——c++中有一个结构体 BITMAPFILEHEADER 与其对应 2)接下来的40个字节 是位图信息头 —— C++中有一个结构体 BITMAPINFOHEADER 与其对应 3)再接下来就是调色板——字节数和你所用的文件的颜色总数有关,例如,256色,就有256条记录;16色就有,16条记录。注意,每条记录有4个字节,文件中存储顺序(BGR)再加上一个保留字节。如果是24真彩色,那么就没有调色板。 4)接下来就是位图信息了。如果是24真彩色,那么就是三个字节代表一个像素的RGB;如果,不是24真彩色,就是一个字节代表一个像素的RGB。需要注意的是,(非24真彩色时)这一个字节代表的只是索引值,用来寻找调色板中对应该索引的RGB值。 综上所述,你只要用一个指针指向位图信息,再根据相应的颜色数,就可以取得RGB值。 贴具体代码,比较麻烦。不过,弄清楚了这些,你就可以自己写了。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
#include<iostream> #include<fstream> using namespace std; int data[4096][4096]; int main() { fstream input; input.open("1.bmp", ios::in | ios::binary); input.seekg(18L, ios::beg); long vaule[2]; input.read(reinterpret_cast<char*> (&vaule), sizeof (vaule)); cout << vaule[0] << " " << vaule[1] << " " << input.tellg() << endl; long newwidth = vaule[0] * 3; if (newwidth % 4 != 0) newwidth = newwidth + 4 - newwidth % 4; cout << newwidth << endl; input.seekg(54L, ios::beg); unsigned char bgr[newwidth]; //这一句vc不通过,我用netbeans实现的 for (int i = vaule[1] - 1; i >= 0; i--) { input.read(reinterpret_cast<char*> (&bgr), sizeof (bgr)); for(int j = 0; j < vaule[0] * 3; j++) data[i][j] = bgr[j] - 0; } int r,l; while(cin >> r >> l){ int m = 3 * l - 3; cout << data[r - 1][m] << " " << data[r - 1][m + 1] << " " << data[r - 1][m + 2] << endl; } input.close(); return 0; }
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |