C++ fstream读取bmp图像

以前都是使C语言中File* 、fopen、fread等操作文件,这几天学习了C++ IO标准库,就应用来读取bmp图像。


 
 
  1. #include "stdafx.h"
  2. #include <fstream>
  3. # include <windows.h>
  4. #include <opencv2/opencv.hpp>
  5. using namespace std;
  6. using namespace cv;
  7. int _tmain( int argc, _TCHAR* argv[])
  8. {
  9. BITMAPFILEHEADER fh;
  10. BITMAPINFOHEADER ih;
  11. int rows, cols;
  12. Mat showImg;
  13. ifstream src("2.bmp", ifstream::binary); //2.bmp为灰度图像
  14. if (!src)
  15. {
  16. cerr << "打开失败";
  17. return -1;
  18. }
  19. src.read(( char *)&fh, sizeof(BITMAPFILEHEADER));
  20. if (fh.bfType != 'MB')
  21. {
  22. cerr << "这不是BMP图像";
  23. return -1;
  24. }
  25. src.read(( char *)&ih, sizeof(BITMAPINFOHEADER));
  26. rows = ih.biHeight;
  27. cols = ih.biWidth;
  28. //bmp图像数据存储是4字节对齐的
  29. int colsDQ = (cols + 3) / 4 * 4;
  30. //移动到图像数据处
  31. src.seekg( sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)+ sizeof(RGBQUAD) * 256, ios::beg); //参数:相对位置,起点
  32. showImg = Mat::zeros(rows, cols, CV_8U);
  33. //读取图像数据
  34. uchar *pData = new uchar[rows*colsDQ];
  35. src.read(( char *)pData, rows*colsDQ);
  36. //bmp图像数据转换到Mat图像数据(Mat图像数据非对齐)
  37. for ( int i = rows - 1; i >= 0; --i) //bmp图像存储为行倒序
  38. for ( int j = 0; j < cols; ++j)
  39. {
  40. showImg.ptr<uchar>(rows - 1 - i)[j] = *(pData + i*colsDQ + j);
  41. }
  42. delete[]pData;
  43. imshow( "hi", showImg);
  44. waitKey();
  45. return 0;
  46. }

参考:

1、点击打开链接

2、点击打开链接 写bmp图像

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值