纯c++读取与显示BMP图片

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_36251561/article/details/77369522

这是个控制台程序,无论是在VC6.0还是在vs上都能够直接用,这就涉及到纯C++语言的图像处理编程


 
 
  1. #include<iostream>
  2. #include<Windows.h>
  3. #include<malloc.h>
  4. #include<stdlib.h>
  5. #include<stdio.h>
  6. #include<string.h>
  7. using namespace std;
  8. void main ()
  9. {
  10. char fileName[ 30]; //定义打开图像名字
  11. char *buf; //定义文件读取缓冲区
  12. char *p;
  13. int r,g,b,pix;
  14. HWND wnd; //窗口句柄
  15. HDC dc; //绘图设备环境句柄
  16. FILE *fp; //定义文件指针
  17. FILE *fpw; //定义保存文件指针
  18. DWORD w,h; //定义读取图像的长和宽
  19. DWORD bitCorlorUsed; //定义
  20. DWORD bitSize; //定义图像的大小
  21. BITMAPFILEHEADER bf; //图像文件头
  22. BITMAPINFOHEADER bi; //图像文件头信息
  23. cout<< "请输入要打开文件的名字:(如:e:\\1.bmp)";
  24. cin>>fileName;
  25. if((fp=fopen(fileName, "rb"))== NULL)
  26. {
  27. cout<< "文件未找到!";
  28. exit( 0);
  29. }
  30. fread(&bf, sizeof(BITMAPFILEHEADER), 1,fp); //读取BMP文件头文件
  31. fread(&bi, sizeof(BITMAPINFOHEADER), 1,fp); //读取BMP文件头文件信息
  32. w=bi.biWidth; //获取图像的宽
  33. h=bi.biHeight; //获取图像的高
  34. bitSize=bi.biSizeImage; //获取图像的size
  35. buf=( char*) malloc(w*h* 3); //分配缓冲区大小
  36. fseek(fp, long( sizeof(BITMAPFILEHEADER)+ sizeof(BITMAPINFOHEADER)), 0); //定位到像素起始位置
  37. fread(buf, 1,w*h* 3,fp); //开始读取数据
  38. wnd=GetForegroundWindow(); //获取窗口句柄
  39. dc=GetDC(wnd); //获取绘图设备
  40. int x= 40;
  41. int y= 40;
  42. p=buf;
  43. for( int j= 0;j<h;j++)
  44. {
  45. for( int i= 0;i<w;i++)
  46. {
  47. b=*p++;g=*p++;r=*p++;
  48. pix=RGB(r,g,b);
  49. SetPixel(dc,x+i,y+h-j,pix);
  50. }
  51. }
  52. fpw=fopen( "LenaSaved.bmp", "wb");
  53. fwrite(&bf, sizeof(BITMAPFILEHEADER), 1,fpw); //写入文件头
  54. fwrite(&bi, sizeof(BITMAPINFOHEADER), 1,fpw); //写入文件头信息
  55. p=buf;
  56. for( j= 0;j<h;j++)
  57. {
  58. for( int i= 0;i<w* 3;i++)
  59. {
  60. fwrite(p++, 1, 1,fpw);
  61. }
  62. }
  63. fclose(fpw);
  64. fclose(fp);
  65. //return fp;
  66. }

第二次编辑内容:从控制台转向MFC编程,下面的代码可用于单文档和多文档,打开和保存BMP图像


 
 
  1. void CMyDIPView::OnOK()
  2. {
  3. //CFileDialog为VC中打开文件对话框类
  4. BITMAPFILEHEADER bmpHeader; //文件头
  5. BITMAPINFOHEADER bmpInfo; //信息头
  6. CFileDialog dlg(TRUE, "*.BMP", NULL, NULL,"位图文件(*.BMP)|*.bmp;*.BMP|",this);
  7. CFile bmpFile; //记录打开文件
  8. CString strFileName; //记录选择文件路径
  9. if (!dlg.DoModal() == IDOK) return;
  10. strFileName = dlg.GetPathName(); //以只读的方式打开文件
  11. if(!bmpFile.Open(strFileName, CFile::modeRead|CFile::typeBinary)) return;
  12. if (bmpFile.Read(&bmpHeader, sizeof(BITMAPFILEHEADER)) != sizeof(BITMAPFILEHEADER))
  13. { AfxMessageBox( "read bmp header failed!");
  14. return;
  15. } if (bmpHeader.bfType != 0x4d42)
  16. { AfxMessageBox( "invalid file type!"); return; }
  17. if (bmpFile.Read(&bmpInfo, sizeof(BITMAPINFOHEADER)) != sizeof(BITMAPINFOHEADER))
  18. { AfxMessageBox( "read bmp infor header failed!");
  19. return; } if (bmpInfo.biBitCount != 24)
  20. { AfxMessageBox( "File is not 24 bit.Application doesn't support this kind of file!");
  21. return;
  22. }
  23. pBmpInfo = (BITMAPINFO *) new char[ sizeof(BITMAPINFOHEADER)];
  24. if (!pBmpInfo)
  25. {
  26. AfxMessageBox( "memory error!");
  27. return;
  28. }
  29. //为图像数据申请空间
  30. memcpy(pBmpInfo,&bmpInfo, sizeof(BITMAPINFOHEADER));
  31. DWORD dataBytes = bmpHeader.bfSize - bmpHeader.bfOffBits;
  32. pBmpData = (BYTE*) new char[dataBytes];
  33. if (!pBmpData)
  34. {
  35. AfxMessageBox( "memory error!");
  36. delete pBmpData; return;
  37. } if (bmpFile.Read(pBmpData,dataBytes) != dataBytes)
  38. { AfxMessageBox( "Read bmp data failed!");
  39. delete pBmpInfo;
  40. delete pBmpData;
  41. return;
  42. }
  43. bmpFile.Close();
  44. CWnd *pWnd=GetDlgItem(IDC_PICTURE); //获得pictrue控件窗口的句柄
  45. CRect rect;
  46. pWnd->GetClientRect(&rect); //获得pictrue控件所在的矩形区域
  47. CDC *pDC=pWnd->GetDC(); //获得pictrue控件的DC
  48. //显示图片
  49. pDC->SetStretchBltMode(COLORONCOLOR);
  50. StretchDIBits(pDC->GetSafeHdc(), 0, 0,rect.Width(),rect.Height(), 0, 0,bmpInfo.biWidth,bmpInfo.biHeight,pBmpData,pBmpInfo,DIB_RGB_COLORS,SRCCOPY);
  51. iBmpWidth=bmpInfo.biWidth;
  52. iBmpHeight=bmpInfo.biHeight; // TODO: Add extra validation here
  53. }
  54. void CMyDIPView::OnSave()
  55. {
  56. BITMAPFILEHEADER bmpf; //文件头
  57. BITMAPINFOHEADER bmpi; //信息头
  58. int Widthbytes;
  59. CFile bmpFile;
  60. CString strFileName;
  61. CFileDialog dlg(FALSE, "*.BMP", NULL, NULL,"位图文件(*.BMP)|*.bmp;*.BMP|");
  62. if (!dlg.DoModal()==IDC_SAVE) return;
  63. strFileName = dlg.GetPathName();
  64. if (bmpFile.Open(strFileName, CFile::modeCreate | CFile::modeReadWrite) == 0) return;
  65. Widthbytes = (iBmpWidth* 3+ 3)/ 4* 4; //位图对齐,确保为4的倍数
  66. /* BITMAPFILEHEADER结构填写 */
  67. bmpf.bfType = 0x4d42;
  68. bmpf.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
  69. bmpf.bfSize = bmpf.bfOffBits + Widthbytes *iBmpHeight;
  70. bmpf.bfReserved1 = 0;
  71. bmpf.bfReserved2 = 0;
  72. /* BITMAPINFOHEADER结构填写 */
  73. bmpi.biSize = sizeof(BITMAPINFOHEADER);
  74. bmpi.biWidth = iBmpWidth;
  75. bmpi.biHeight =iBmpHeight;
  76. bmpi.biPlanes = 1;
  77. bmpi.biBitCount = 24; //24位
  78. bmpi.biCompression = BI_RGB;
  79. bmpi.biSizeImage = 0;
  80. bmpi.biXPelsPerMeter = 0;
  81. bmpi.biYPelsPerMeter = 0;
  82. bmpi.biClrUsed = 0;
  83. bmpi.biClrImportant = 0;
  84. bmpFile.Write(&bmpf, sizeof(bmpf)); //写文件头;
  85. bmpFile.Write(&bmpi, sizeof(bmpi)); //写信息头;
  86. bmpFile.Write(pBmpData,Widthbytes*iBmpHeight); //写图像数据信息;
  87. bmpFile.Close();
  88. // TODO: Add your control notification handler code here
  89. }



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值