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

本文介绍了一个使用纯C++进行图像处理的控制台程序,并演示了如何在MFC框架下打开和保存BMP图像文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.youkuaiyun.com/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、付费专栏及课程。

余额充值