现在的位置: 首页 > 综合 > 正文

图像处理头文件源码

2018年01月29日 ⁄ 综合 ⁄ 共 4250字 ⁄ 字号 评论关闭

#if ! defined (_LOADBMP_H)
#define _LOADBMP_H

#if ! defined (EXTRA_NAME)
#define EXTRA_NAME "~EX."
#endif

#include <afx.h>
#include <iostream.h>
#include <windows.h>
#include <math.h>

#define pi (double)3.14159265359

int nWidth;
int nHeight;
int nLen;
int nByteWidth;
BYTE *lpBackup;
BYTE *lpBitmap;
BYTE *lpBits;
CString FileName;
CString Front;
CString Rear;

/*复数定义*/
typedef struct
{
 double re;
 double im;
}COMPLEX;

/*复数加运算*/
COMPLEX Add(COMPLEX c1, COMPLEX c2)
{
 COMPLEX c;
 c.re=c1.re+c2.re;
 c.im=c1.im+c2.im;
 return c;
}

/*复数减运算*/
COMPLEX Sub(COMPLEX c1, COMPLEX c2)
{
 COMPLEX c;
 c.re=c1.re-c2.re;
 c.im=c1.im-c2.im;
 return c;
}

/*复数乘运算*/
COMPLEX Mul(COMPLEX c1, COMPLEX c2)
{
 COMPLEX c;
 c.re=c1.re*c2.re-c1.im*c2.im;
 c.im=c1.re*c2.im+c2.re*c1.im;
 return c;
}

void GetPoints(BYTE *lpPoints)
{
 int x,y,p;
 for(y=0;y<nHeight;y++)
 {
  for(x=0;x<nWidth;x++)
  {
   p=x*3+y*nByteWidth;
   lpPoints[x+y*nWidth]=(BYTE)(0.299*(float)lpBits[p+2]+0.587*(float)lpBits[p+1]+0.114*(float)lpBits[p]+0.1);
  }
 }
}

void PutPoints(BYTE *lpPoints)
{
 int x,y,p,p1;
 for(y=0;y<nHeight;y++)
 {
  for(x=0;x<nWidth;x++)
  {
   p=x*3+y*nByteWidth;
   p1=x+y*nWidth;
   lpBits[p]=lpPoints[p1];
   lpBits[p+1]=lpPoints[p1];
   lpBits[p+2]=lpPoints[p1];
  }
 }
}

void CuttheName()
{
 int Position;
 Position=FileName.Find('.');
 Front=FileName.Left(Position);
 Rear=FileName.Mid(Position+1);
}

void LoadBitmap()
{
 BITMAPINFOHEADER *pInfo;
 pInfo=(BITMAPINFOHEADER *)(lpBitmap+sizeof(BITMAPFILEHEADER));
 nWidth=pInfo->biWidth;
 nByteWidth=nWidth*3;
 if (nByteWidth%4) nByteWidth+=4-(nByteWidth%4);
 nHeight=pInfo->biHeight;
 if (pInfo->biBitCount!=24)
 {
  if (pInfo->biBitCount!=8)
  {
   cout<<"Invalidation Bitmap";
   delete lpBitmap;
   lpBitmap=0;
   return;
  }
  unsigned int PaletteSize=1<<pInfo->biBitCount;
  if (pInfo->biClrUsed!=0 && pInfo->biClrUsed<PaletteSize) PaletteSize=pInfo->biClrUsed;
  lpBits=lpBitmap+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
  RGBQUAD *pPalette=(RGBQUAD *)lpBits;
  lpBits+=sizeof(RGBQUAD)*PaletteSize;
  nLen=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+nByteWidth*nHeight;
  BYTE *lpTemp=lpBitmap;
  lpBitmap=new BYTE[nLen];
  BITMAPFILEHEADER bmh;
  BITMAPINFOHEADER bmi;
  bmh.bfType='B'+'M'*256;
  bmh.bfSize=nLen;
  bmh.bfReserved1=0;
  bmh.bfReserved2=0;
  bmh.bfOffBits=54;
  bmi.biSize=sizeof(BITMAPINFOHEADER);
  bmi.biWidth=nWidth;
  bmi.biHeight=nHeight;
  bmi.biPlanes=1;
  bmi.biBitCount=24;
  bmi.biCompression=BI_RGB;
  bmi.biSizeImage=0;
  bmi.biXPelsPerMeter=0;
  bmi.biYPelsPerMeter=0;
  bmi.biClrUsed=0;
  bmi.biClrImportant=0;
  int nBWidth=pInfo->biWidth;
  if (nBWidth%4) nBWidth+=4-(nBWidth%4);
  memset(lpBitmap,0,nLen);
  memcpy(lpBitmap,&bmh,sizeof(BITMAPFILEHEADER));
  memcpy(lpBitmap+sizeof(BITMAPFILEHEADER),&bmi,sizeof(BITMAPINFOHEADER));
  BYTE *lpBits2=lpBitmap+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
  int x,y,p1,p2,Palette;
  for(y=0;y<nHeight;y++)
  {
   for(x=0;x<nWidth;x++)
   {
    p1=y*nBWidth+x;
    p2=y*nByteWidth+x*3;
    if (lpBits[p1]<PaletteSize) Palette=lpBits[p1];
    else Palette=0;
    lpBits2[p2]=pPalette[Palette].rgbBlue;
    lpBits2[p2+1]=pPalette[Palette].rgbGreen;
    lpBits2[p2+2]=pPalette[Palette].rgbRed;
   }
  }
  delete lpTemp;
 }
 lpBits=lpBitmap+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
 if (lpBackup) delete lpBackup;
 lpBackup=new BYTE[nLen];
 memcpy(lpBackup,lpBitmap,nLen);
}

void OpenFile()
{
 CFile File=0;
 if (!File.Open(FileName,CFile::modeRead)) return;
 CuttheName();
 if (lpBitmap) delete lpBitmap;
 nLen=File.GetLength();
 lpBitmap=new BYTE[nLen];
 File.Read(lpBitmap,nLen);
 LoadBitmap();
}

void SaveAs()
{
 CFile file;
 if (lpBitmap==0) return;
 if (!file.Open(Front+EXTRA_NAME+Rear,CFile::modeWrite|CFile::modeCreate))
 {
  cout<<"ERROR~~\n";
  return;
 }
 int nLen=nByteWidth*nHeight;
 BYTE *pMem=new BYTE[nLen+sizeof(BITMAPINFOHEADER)];
 BITMAPINFOHEADER *bmi=(BITMAPINFOHEADER *)pMem;
 bmi->biSize=sizeof(BITMAPINFOHEADER);
 bmi->biWidth=nWidth;
 bmi->biHeight=nHeight;
 bmi->biPlanes=1;
 bmi->biBitCount=24;
 bmi->biCompression=BI_RGB;
 bmi->biSizeImage=0;
 bmi->biXPelsPerMeter=0;
 bmi->biYPelsPerMeter=0;
 bmi->biClrUsed=0;
 bmi->biClrImportant=0;
 BITMAPFILEHEADER bmh;
 bmh.bfType='B'+'M'*256;
 bmh.bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+nLen;
 bmh.bfReserved1=0;
 bmh.bfReserved2=0;
 bmh.bfOffBits=54;
 memcpy(pMem+sizeof(BITMAPINFOHEADER),lpBits,nLen);
 file.Write(&bmh,sizeof(BITMAPFILEHEADER));
 file.Write(pMem,nLen+sizeof(BITMAPINFOHEADER));
 file.Close();
}

#endif

抱歉!评论已关闭.