C++ fstream读取bmp图像
以前都是使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图像
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。
- 上一篇: windows基于TCP/IP的简单文件/图片传输
- 下一篇: UE4C++读取图片