📄 imageprocess.cpp
字号:
// 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 + -