以前都是使C语言中File* 、fopen、fread等操作文件,这几天学习了C++ IO标准库,就应用来读取bmp图像。
-
#include "stdafx.h"
-
#include <fstream>
-
# include <windows.h>
-
#include <opencv2/opencv.hpp>
-
using
namespace
std;
-
using
namespace cv;
-
-
int _tmain(
int argc, _TCHAR* argv[])
-
{
-
BITMAPFILEHEADER fh;
-
BITMAPINFOHEADER ih;
-
int rows, cols;
-
Mat showImg;
-
-
ifstream src("2.bmp", ifstream::binary);
//2.bmp为灰度图像
-
if (!src)
-
{
-
cerr <<
"打开失败";
-
return
-1;
-
}
-
src.read((
char *)&fh,
sizeof(BITMAPFILEHEADER));
-
if (fh.bfType !=
'MB')
-
{
-
cerr <<
"这不是BMP图像";
-
return
-1;
-
}
-
src.read((
char *)&ih,
sizeof(BITMAPINFOHEADER));
-
rows = ih.biHeight;
-
cols = ih.biWidth;
-
//bmp图像数据存储是4字节对齐的
-
int colsDQ = (cols +
3) /
4 *
4;
-
//移动到图像数据处
-
src.seekg(
sizeof(BITMAPFILEHEADER) +
sizeof(BITMAPINFOHEADER)+
sizeof(RGBQUAD) *
256, ios::beg);
//参数:相对位置,起点
-
showImg = Mat::zeros(rows, cols, CV_8U);
-
//读取图像数据
-
uchar *pData =
new uchar[rows*colsDQ];
-
src.read((
char *)pData, rows*colsDQ);
-
//bmp图像数据转换到Mat图像数据(Mat图像数据非对齐)
-
for (
int i = rows -
1; i >=
0; --i)
//bmp图像存储为行倒序
-
for (
int j =
0; j < cols; ++j)
-
{
-
showImg.ptr<uchar>(rows -
1 - i)[j] = *(pData + i*colsDQ + j);
-
}
-
delete[]pData;
-
imshow(
"hi", showImg);
-
-
waitKey();
-
return
0;
-
}
参考:
1、点击打开链接
2、点击打开链接 写bmp图像