⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 imageprocess.cpp

📁 CONAXCA的源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// ImageProcess.cpp: implementation of the CImageProcess class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "math.h"
#include "VcImage.h"

#include "ImageProcess.h"

#include "CDib_VC.h"
  
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

int  RotateFlag;

CImageProcess::CImageProcess()
{
   m_pDib=m_pDib1=NULL;  
   hWndView=NULL;
#ifdef Capture
   CaptureWidth=768,CaptureHeight=576;
   CaptureFlag=OkCap.OpenCard(hWndView,&Wid,&Hei);
#endif
}

CImageProcess::~CImageProcess()
{
   if(m_pDib!=NULL) 
      delete [] m_pDib;
   if(m_pDib1!=NULL) 
	  delete [] m_pDib1;

#ifdef Capture
   if (CaptureFlag)
      OkCap.CloseCard();
#endif
}

BYTE* CImageProcess::CreateDib(int wid, int hei, int bits) 
{
   BITMAPINFOHEADER bmi = {40,0,0,1,0,0,0,0,0,0,0  } ;
   long size,colors;
   BYTE *pDib=0;
 
   bmi.biWidth=wid;	//  宽度
   bmi.biHeight=hei;	//  高度
   bmi.biBitCount=(WORD) bits;	//  每像素位数

   if (bits<=8) colors=1<<bits;
   else         colors=0;
   size=40+colors*4+((31L+wid*bits)/32*4)*hei;
   pDib=new BYTE [size];
   memcpy(pDib,&bmi,40);
   return(pDib);
}

void CImageProcess::SetDibParam(BYTE *pDib)
{
	BITMAPINFOHEADER *pBIH;

 	m_pBI=(BITMAPINFO *) m_pDib;
 	pBIH=(BITMAPINFOHEADER *) m_pDib;

    wid=pBIH->biWidth;
    hei=pBIH->biHeight;
    bits=pBIH->biBitCount;
    bpl=((long)wid*bits+31)/32*4;
    bpp=(bits+1)/8;

    colors=1<<pBIH->biBitCount;
    if(pBIH->biBitCount>8)   colors=0;
    else if(pBIH->biClrUsed!=0) 
		colors=pBIH->biClrUsed;

    m_pBits=pDib+sizeof(BITMAPINFOHEADER)+
		                 colors*sizeof(RGBQUAD);
}

BYTE* CImageProcess::GetPDib(int n)
{
   if (n==0)
	   return(m_pDib);
   else
	   return(m_pDib1);
}

void CImageProcess::GetDibParam(BYTE *pDib,
			BITMAPINFO* pBI,BYTE *pBits)
{
 	BITMAPINFOHEADER* pBIH;

 	pBI=(BITMAPINFO *) pDib;
 	pBIH=(BITMAPINFOHEADER *) pDib;

    colors=1<<pBIH->biBitCount;
    if(pBIH->biBitCount>8)   colors=0;
    else if(pBIH->biClrUsed!=0) 
		colors=pBIH->biClrUsed;

    pBits=pDib+sizeof(BITMAPINFOHEADER)+
		                 colors*sizeof(RGBQUAD);
}

BOOL CImageProcess::LoadBmp(const char *pszFilename)
{
	CFile	cf;
	BITMAPFILEHEADER BFH;
	DWORD	dwDibSize;
	BYTE    *pDib,*pDib1;
  
	if(!cf.Open(pszFilename,CFile::modeRead))
		return(FALSE);
	dwDibSize=cf.GetLength()-sizeof(BITMAPFILEHEADER);

	if(m_pDib!=NULL) delete [] m_pDib;

	pDib =new BYTE [dwDibSize];
	if(pDib==NULL)
		return(FALSE);

	if(cf.Read(&BFH,sizeof(BITMAPFILEHEADER)) !=
		sizeof(BITMAPFILEHEADER)||
		BFH.bfType!='MB'||
		cf.Read(pDib,dwDibSize)!=dwDibSize)
	{
		delete [] pDib;
		return(FALSE);
	}
	m_pDib=pDib;
    cf.Close();

	pDib1=new BYTE [dwDibSize];
	if(pDib1==NULL) return(FALSE);
	m_pDib1=pDib1;
    memcpy(m_pDib1,m_pDib,dwDibSize);
    RotateFlag=0;
	return(TRUE);
}

BOOL CImageProcess::SaveBmp(const char *pszFilename)
{
	BITMAPFILEHEADER BFH;
	DWORD   dwDibSize;
 	char    ch[40];
	CFile   cf;
	int     k;
 
	if(m_pDib==NULL)  return(FALSE);

    strcpy(ch,pszFilename);
    k=strlen(ch);
	if (ch[k-4]!='.') 
       strcat(ch,".bmp");

	if(!cf.Open(ch,CFile::modeCreate|CFile::modeWrite))
		return(FALSE);

	BFH.bfType='MB';
    BFH.bfReserved1=0;
    BFH.bfReserved2=0;
    dwDibSize=40L+colors*4+((31+wid*bits)/32*4)*hei;
	BFH.bfSize=sizeof(BITMAPFILEHEADER)+dwDibSize;
	BFH.bfOffBits=sizeof(BITMAPFILEHEADER)+
		sizeof(BITMAPINFOHEADER)+colors*sizeof(RGBQUAD);

	cf.Write(&BFH,sizeof(BITMAPFILEHEADER));
   	cf.Write(m_pDib,dwDibSize);
    cf.Close();
  	return(TRUE);
}

BOOL CImageProcess::Draw(CDC* pDC)
{
   if(m_pDib==NULL)
	  return(FALSE);

   SetDibParam(m_pDib);
   StretchDIBits(pDC->m_hDC,0,0,wid,hei,
		0,0,wid,hei,
		m_pBits,m_pBI,
		DIB_RGB_COLORS,SRCCOPY);
   return(TRUE);
}

void CImageProcess::Refresh(void)
{
   int  wid,hei,bits,colors;
   CDIB *pdib;
   long  size;
 
   if (m_pDib1==NULL) return;
   pdib = new CDIB(m_pDib1);
   wid=pdib->GetWidth();		
   hei=pdib->GetHeight();
   bits=pdib->GetBitCount();
   colors=pdib->GetColors();
   delete pdib;

   if(m_pDib!=NULL) delete [] m_pDib;
   m_pDib=CreateDib(wid,hei,bits);
   size=colors*4+((wid*bits+31)/32*4)*hei+40;
   memcpy(m_pDib,m_pDib1,size);
   RotateFlag=0;
}

BOOL CImageProcess::Invert(void)
{
   int	x,y;
   int	i,r,g,b;
   int  wid,hei,bits,bpl,bpp,colors;
   CDIB *pdib;
   BYTE	*buf;
 
   if (m_pDib==NULL) return FALSE;

   pdib = new CDIB(m_pDib);
   wid=pdib->GetWidth();		
   hei=pdib->GetHeight();
   bits=pdib->GetBitCount();
   bpl=pdib->GetBytesPerLine();
   bpp=pdib->GetBytesPerPixel();
   colors=pdib->GetColors();
   if (colors>(1<<bits)) colors=1<<bits;

   if (bits<8) {
      delete pdib;
	  return FALSE;
   }

   buf=(BYTE*) malloc(bpl);
   if (bits==24) {
  	  for(y=0;y<hei;y++) {
	     pdib->getimage(0,y,wid,1,buf);
		 for (x=0;x<wid*bpp;x++) buf[x]=255-buf[x];
	     pdib->setimage(0,y,wid,1,buf);
	  }
   }
   else if (bits<=8) {
	  for (i=0;i<colors;i++) {
		 pdib->getpalette(i,&r,&g,&b);
		 pdib->setpalette(i,255-r,255-g,255-b);
	  }
   }
   delete pdib;
   free(buf);
   return TRUE;
}

BOOL CImageProcess::ColorToGray(void)
{
   int	i,x,y,k,r,g,b;
   int  wid,hei,bits,bpl,bpp,colors;
   BYTE	*lpBuf,tab[256];
   CDIB *pdib;

   if (m_pDib==NULL) return FALSE;

   pdib = new CDIB(m_pDib);
   wid=pdib->GetWidth();		
   hei=pdib->GetHeight();
   bits=pdib->GetBitCount();
   bpl=pdib->GetBytesPerLine();
   bpp=pdib->GetBytesPerPixel();
   colors=pdib->GetColors();
   if (colors>(1<<bits)) colors=1<<bits;

   if (bits<8) {
      delete pdib;
	  return FALSE;
   }

   if (bits==24) { 
	  for(y=0;y<hei;y++) {
	     lpBuf=pdib->DibAddress(0,y);
		 for (x=0;x<wid;x++,lpBuf+=bpp) {
		    k=(11*lpBuf[0]+59*lpBuf[1]+30*lpBuf[2]+50)/100;
			lpBuf[0]=lpBuf[1]=lpBuf[2]=k;
		 }
	  }
   }
   else if (bits==8) {
	  for (i=0;i<colors;i++) {
         pdib->getpalette(i,&r,&g,&b);
		 k=(30*r+59*g+11*b+50)/100;
		 pdib->setpalette(i,k,k,k);
		 tab[i]=(BYTE) k;
	  }
      if (colors==(1<<bits)) {
	     for (i=0;i<256;i++) 
 		    pdib->setpalette(i,i,i,i);
         for(y=0;y<hei;y++) {
	        lpBuf=pdib->DibAddress(0,y);
		    for (x=0;x<wid;x++,lpBuf++) {
		       *lpBuf=tab[(*lpBuf)];
			}
		 }
	  }
   }
   delete pdib;
   return TRUE;
}

void CImageProcess::Flip(int n)
{
   int	x,y,k;
   BYTE	*buf1,*buf2;
   CDIB *pdib;
   int  wid,hei,bits,bpl,bpp;
 
   if (m_pDib==NULL) return;

   pdib = new CDIB(m_pDib);
   wid=pdib->GetWidth();		
   hei=pdib->GetHeight();
   bits=pdib->GetBitCount();
   bpl=pdib->GetBytesPerLine();
   bpp=pdib->GetBytesPerPixel();

   if (bits<8) {
      delete pdib;
	  return;
   }
 
   pdib = new CDIB(m_pDib);

   if (hei*bpp>bpl) k=hei*bpp;
   else             k=bpl;
   buf1=(BYTE*) malloc(k);
   buf2=(BYTE*) malloc(k);
   if (n&0x1) {
      for(x=0;x<wid/2;x++) {
	     pdib->getimage(x,0,1,hei,buf1);
		 pdib->getimage(wid-1-x,0,1,hei,buf2);
 		 pdib->setimage(x,0,1,hei,buf2);
 		 pdib->setimage(wid-1-x,0,1,hei,buf1);
	  }
   }
   if (n&0x2) {
      for(y=0;y<hei/2;y++) {
	     pdib->getimage(0,y,wid,1,buf1);
		 pdib->getimage(0,hei-1-y,wid,1,buf2);
 		 pdib->setimage(0,y,wid,1,buf2);
 		 pdib->setimage(0,hei-1-y,wid,1,buf1);
	  }
   }
   free(buf1);
   free(buf2);
   delete pdib;
}

void CImageProcess::FlipHorzontal(void)
{
   Flip(1);
}

void CImageProcess::FlipVertical(void)
{
   Flip(2);
}

void CImageProcess::Rotate180(void)
{
   Flip(3);
}

void CImageProcess::Rotate90a(int n) 
{
   int  i,j,k,m,t,r,g,b,num;
   BYTE *buff1,*buff2;
   CDIB *pdib1,*pdib2;
   long size;
   int  wid,hei,bits,bpl,bpp;
   
   if (m_pDib==NULL) return;

   pdib1 = new CDIB(m_pDib);
   wid=pdib1->GetWidth();		
   hei=pdib1->GetHeight();
   bits=pdib1->GetBitCount();
   bpl=pdib1->GetBytesPerLine();
   bpp=pdib1->GetBytesPerPixel();

   if (bits<8) {
      delete pdib1;
	  return;
   }
 
   num=hei*bpp;
   if (num<bpl)  num=bpl;
   buff1=(BYTE*) malloc(num);
   buff2=(BYTE*) malloc(num);

   if(m_pDib1!=NULL) delete [] m_pDib1;
   m_pDib1=CreateDib(hei,wid,bits);

   pdib1 = new CDIB(m_pDib);
   pdib2 = new CDIB(m_pDib1);
   for (i=0;i<hei;i++) {
 	  pdib1->getimage(0,i,wid,1,buff1);
	  if (n==1) {
	     for (j=0,k=(wid-1)*bpp;j<wid*bpp/2;j+=bpp,k-=bpp) {
			for (m=0;m<bpp;m++) {
			   t=buff1[j+m];	buff1[j+m]=buff1[k+m];
			   buff1[k+m]=t;
			}
		 }
 		 pdib2->setimage(i,0,1,wid,buff1);
	  }
	  else {
	     pdib2->setimage(hei-1-i,0,1,wid,buff1);
	  }
   }
   if (bits<=8) {
	  for (i=0;i<256;i++) {
         pdib1->getpalette(i,&r,&g,&b);
	     pdib2->setpalette(i,r,g,b);
	  }
   }
   delete pdib1;
   delete pdib2;
   free(buff1);
   free(buff2);

   if(m_pDib!=NULL) delete [] m_pDib;
   m_pDib=CreateDib(hei,wid,bits);

   size=40L+colors*4+((31+hei*bits)/32*4)*wid;
   memcpy(m_pDib,m_pDib1,size);
}

void CImageProcess::Rotate90(void) 
{
   Rotate90a(0);
}

void CImageProcess::Rotate270(void) 
{
   Rotate90a(1);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -