实现位位图颜色的取反_第1页
实现位位图颜色的取反_第2页
实现位位图颜色的取反_第3页
实现位位图颜色的取反_第4页
实现位位图颜色的取反_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第一题第一部分:代码#include<windows.h>#include<iostream>#include<fstream>#include <iomanip>using namespace std;/定义类class CBmppublic: /读图像文件信息 bool ReadInfo(char FilePath); /写图像灰度信息到文本文件 bool Createbmp(char FilePath,char szFileName ); /生成bmp文件 CBmp();/构造函数 virtual CBmp();/析构函数private:

2、BITMAPFILEHEADER m_sBMFH; /位图文件头 BITMAPINFOHEADER m_sBMIH; /位图信息头 RGBQUAD * m_pPalette; /调色板 BYTE * m_pBData; /位图数据 ;/CBmp:CBmp() m_pPalette = NULL; m_pBData = NULL;CBmp:CBmp() if(m_pPalette!=NULL) delete m_pPalette; m_pPalette = NULL; if(m_pBData!=NULL) delete m_pBData; m_pBData = NULL; /读图像文件bool

3、CBmp:ReadInfo(char FilePath) int nSize; /用来记录调色板的大小 ifstream fin;/打开文件 fin.open(FilePath,ios:binary); if(!fin) cerr<<"Open file error!"<<endl; return false; /读取文件头 fin.read(char *)(&m_sBMFH),sizeof(BITMAPFILEHEADER); / 判断是否BMP格式 if(m_sBMFH.bfType!=0x4d42) cout<<"

4、该文件不是BMP格式的文件!"<<endl; return false; /读取文件信息头 fin.read(char *)(&m_sBMIH),sizeof(BITMAPINFOHEADER); /计算调色板的大小 nSize = m_sBMFH.bfOffBits - sizeof(BITMAPFILEHEADER) - sizeof(BITMAPINFOHEADER); if(nSize!=0) /读取调色板 m_pPalette = new RGBQUAD nSize/4; fin.read(char *)(m_pPalette),nSize); /读取图

5、像数据 m_pBData = new BYTE m_sBMIH.biSizeImage; fin.read(char *)(m_pBData),m_sBMIH.biSizeImage); fin.close(); return true;/写图像灰度信息到文本文件bool CBmp:Createbmp(char FilePath,char szFileName)/ 选用的灰度转换公式不同,所得的结果基本上是一致的,但是会稍有差别。/ Gray = (R*38 + G*75 + B*15) >> 7; /高精度转灰度公式/ Gray = R*0.299 + G*0.587 + B*0

6、.114 /使用浮点计算,速度较慢 BYTE *pt; int t=0; int d=0; ifstream fin; fin.open(FilePath,ios:binary); if(!fin) cerr<<"Open file error!"<<endl; return false; if(m_sBMIH.biWidth*1%4!=0) t=4-m_sBMIH.biWidth*1%4; /位图数据要求每行字节数必须是4的倍数,不足补齐t / HANDLE hFile; BITMAPFILEHEADER bmfHdr;/位图文件头 BITMAPI

7、NFOHEADER bi;/位图信息头RGBQUAD palette256;/调色板 BYTE *pData ;/位图数据 pData = new BYTE m_sBMIH.biWidth*m_sBMIH.biHeight*1; / 为数据区分配空间if (pData = NULL)return 1;DWORD dwBytesWrite; int nSize; /用来记录调色板的大小 nSize = m_sBMFH.bfOffBits - sizeof(BITMAPFILEHEADER) - sizeof(BITMAPINFOHEADER); /计算调色板的大小/ /读取文件头 fin.rea

8、d(char *)(&bmfHdr),sizeof(BITMAPFILEHEADER); /读取文件信息头 fin.read(char *)(&bi),sizeof(BITMAPINFOHEADER); /构造调色板 for(int i=0;i<256;i+) palettei.rgbBlue=i; palettei.rgbGreen=i; palettei.rgbRed=i; palettei.rgbReserved=0; if ( m_sBMIH.biWidth<= 0 |m_sBMIH.biHeight<= 0 ) return 1;/ for(int

9、i=0;i<m_sBMIH.biHeight;i+) for(int j=0;j<m_sBMIH.biWidth;j+) pt = m_pBData+i*(m_sBMIH.biWidth*1+t)+1*j ;pDatad =255-*(pt);d+; / 初始化结构 RtlZeroMemory(&bmfHdr, sizeof(bmfHdr); RtlZeroMemory(&bi, sizeof(bi);RtlZeroMemory(palette, sizeof(*palette);/ fill the necessary struct fields of the B

10、ITMAPFILEHEADERbmfHdr.bfType=(WORD)0x4d42; / "BM" bmfHdr.bfSize=(WORD)(sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+nSize+m_sBMIH.biWidth*m_sBMIH.biHeight*1);bmfHdr.bfReserved1 = 0; bmfHdr.bfReserved2 = 0; bmfHdr.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)+nSize;/

11、fill the necessary struct fields of the BITMAPINFOHEADER bi.biSize = sizeof(BITMAPINFOHEADER); bi.biBitCount = 8; bi.biHeight = m_sBMIH.biHeight; bi.biWidth = m_sBMIH.biWidth; bi.biCompression = BI_RGB; bi.biPlanes = 1;bi.biClrImportant=bi.biClrUsed=0; bi.biHeight=m_sBMIH.biHeight;bi.biWidth =m_sBMI

12、H.biWidth ;bi.biSizeImage=bi.biWidth*bi.biHeight;bi.biXPelsPerMeter=bi.biYPelsPerMeter=0;/ 生成bmp文件 hFile = CreateFile(szFileName, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if ( hFile = INVALID_HANDLE_VALUE ) delete pData; return 1; / write the BITMAPFILEHEAD

13、ER WriteFile(hFile, &bmfHdr, sizeof(BITMAPFILEHEADER), &dwBytesWrite, NULL); / write the BITMAPINFOHEADER WriteFile(hFile, &bi, sizeof(BITMAPINFOHEADER), &dwBytesWrite, NULL);/生成调色板WriteFile(hFile, &palette,nSize, &dwBytesWrite, NULL); / write the bmp data WriteFile(hFile, pData, m_sBMIH.biWidth * m_sBMIH.biHeight * 1, &dwBytesWrite, NULL); / release resources CloseHandle(hFile); delete pData;fin.close(); return true;/int main(int argc,char *argv) CBmp Bitmap; if( Bitmap.ReadInfo("E:/side6.bmp") ) Bitmap.Createbmp("E:/sid

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论