📄 imageprocess.cpp
字号:
}
BYTE* CImageProcess::ImageRotate(BYTE* pDib,double alpha)
{
BYTE *pDib1=0;
int i,j,x,y,ww,r,g,b;
int Yd,Dx,Dy,max,maxn;
double centerx,centery,sintheta,costheta;
double X1,Y1,X2,Y2,theta,xx,yy,rr;
BYTE *sc,*p;
BYTE **list;
CDIB *pdib1,*pdib;
int wid,hei,bits,bpl,bpp;
if ((RotateFlag==1)||(pDib==NULL)) return(NULL);
pdib = new CDIB(pDib);
wid=pdib->GetWidth();
hei=pdib->GetHeight();
bits=pdib->GetBitCount();
bpl=pdib->GetBytesPerLine();
bpp=pdib->GetBytesPerPixel();
if (bits<8) {
delete pdib;
return(0);
}
Dx=wid; Dy=hei;
sc=(BYTE*) malloc(2*bpl);
list=(BYTE**)malloc(Dy*sizeof(char*));
for (i=0;i<Dy;i++)
list[i]=(BYTE*) pdib->DibAddress(0,hei-1)+(Dy-1-i)*bpl;
centerx=Dx/2; centery=Dy/2;
rr=sqrt(centerx*centerx+centery*centery);
theta=atan((double) centery/(double) centerx);
X1=fabs(rr*cos(alpha+theta));
Y1=fabs(rr*sin(alpha+theta));
X2=fabs(rr*cos(alpha-theta));
Y2=fabs(rr*sin(alpha-theta));
if (X2>X1) X1=X2;
if (Y2>Y1) Y1=Y2;
ww=(int) (2*X1);
pDib1=CreateDib(ww,(int) (2*Y1),bits);
pdib1 = new CDIB(pDib1);
if (bits==8) {
max=maxn=0;
for (i=0;i<256;i++) {
pdib->getpalette(i,&r,&g,&b);
pdib1->setpalette(i,r,g,b);
if (r+g+b>max) {
max=r+g+b; maxn=i;
}
}
}
sintheta=sin(alpha);
costheta=cos(alpha);
for (j=(int)(centery-Y1),Yd=0;j<=centery+Y1;j++,Yd++) {
if (bits==8)
memset(sc,maxn,ww);
else
memset(sc,220,ww*bpp);
for (i=(int)(centerx-X1),p=sc;i<=centerx+X1;i++,p+=bpp) {
xx=centerx+costheta*(i-centerx)+sintheta*(j-centery);
yy=centery-sintheta*(i-centerx)+costheta*(j-centery);
x=(int) xx; y=(int) yy;
if ((x>=0)&&(x<Dx)&&(y>=0)&&(y<Dy)) {
memcpy(p,&list[y][bpp*x],bpp);
}
}
pdib1->setimage(0,Yd,ww,1,sc);
}
delete pdib1;
free(list);
free(sc);
delete pdib;
RotateFlag=1;
return(pDib1);
}
void CImageProcess::Rotate15(void)
{
BYTE *p;
p=m_pDib;
m_pDib=ImageRotate(m_pDib,3.14159/12);
if (m_pDib==NULL) m_pDib=p;
else if (p!=NULL) delete [] p;
}
void CImageProcess::Rotate30(void)
{
BYTE *p;
p=m_pDib;
m_pDib=ImageRotate(m_pDib,3.14159/6);
if (m_pDib==NULL) m_pDib=p;
else if (p!=NULL) delete [] p;
}
void CImageProcess::Rotate45(void)
{
BYTE *p;
p=m_pDib;
m_pDib=ImageRotate(m_pDib,3.14159/4);
if (m_pDib==NULL) m_pDib=p;
else if (p!=NULL) delete [] p;
}
void CImageProcess::Rotate60(void)
{
BYTE *p;
p=m_pDib;
m_pDib=ImageRotate(m_pDib,3.14159/3);
if (m_pDib==NULL) m_pDib=p;
else if (p!=NULL) delete [] p;
}
void CImageProcess::Rotate75(void)
{
BYTE *p;
p=m_pDib;
m_pDib=ImageRotate(m_pDib,3.14159*5/12);
if (m_pDib==NULL) m_pDib=p;
else if (p!=NULL) delete [] p;
}
void CImageProcess::Color(int n)
{
int x,y;
int i,r,g,b;
int wid,hei,bits,bpl,bpp,colors;
CDIB *pdib,*pdib1;
BYTE *buf;
if (m_pDib==NULL) return;
pdib1= new CDIB(m_pDib1);
pdib = new CDIB(m_pDib);
wid=pdib1->GetWidth();
i =pdib->GetWidth();
if (i != wid) {
delete pdib;
Refresh();
pdib = new CDIB(m_pDib);
}
hei=pdib->GetHeight();
bits=pdib->GetBitCount();
bpl=pdib->GetBytesPerLine();
bpp=pdib->GetBytesPerPixel();
colors=pdib->GetColors();
if (colors>(1<<bits)) colors=1<<bits;
buf=(BYTE*) malloc(bpl);
if (bits==24) {
for(y=0;y<hei;y++) {
pdib1->getimage(0,y,wid,1,buf);
for (x=0;x<wid*bpp;x+=bpp) {
switch(n) {
case 0 : buf[x+1]=buf[x+0]=0; break;
case 1 : buf[x+0]=buf[x+2]=0; break;
case 2 : buf[x+2]=buf[x+1]=0; break;
case 3 : buf[x+0]=0; break;
case 4 : buf[x+2]=0; break;
case 5 : buf[x+1]=0; break;
}
}
pdib->setimage(0,y,wid,1,buf);
}
}
else if (bits<=8) {
for (i=0;i<colors;i++) {
pdib1->getpalette(i,&r,&g,&b);
switch(n) {
case 0 : g=b=0; break;
case 1 : b=r=0; break;
case 2 : r=g=0; break;
case 3 : b=0; break;
case 4 : r=0; break;
case 5 : g=0; break;
}
pdib->setpalette(i,r,g,b);
}
}
free(buf);
delete pdib;
delete pdib1;
}
void CImageProcess::ZoomIn(int n)
{
int i,j,k,r,g,b;
BYTE *buf;
CDIB *pdib1,*pdib2;
int wid,hei,bits,bpl,bpp,colors;
if (m_pDib1==NULL) return;
pdib1 = new CDIB(m_pDib1);
wid=pdib1->GetWidth();
hei=pdib1->GetHeight();
bits=pdib1->GetBitCount();
bpl=pdib1->GetBytesPerLine();
bpp=pdib1->GetBytesPerPixel();
colors=pdib1->GetColors();
if (bits<8) {
delete pdib1;
return;
}
if(m_pDib!=NULL) {
delete [] m_pDib;
m_pDib=NULL;
}
m_pDib=CreateDib(wid*n,hei*n,bits);
pdib2 = new CDIB(m_pDib);
buf=(BYTE*) malloc(bpl*n);
for (j=hei-1;j>=0;j--) {
pdib1->getimage(0,j,wid,1,buf);
for (i=bpp*(wid-1);i>=0;i-=bpp)
for (k=0;k<n;k++)
memcpy(&buf[n*i+bpp*k],&buf[i],bpp);
for(k=0;k<n;k++)
pdib2->setimage(0,j*n+k,wid*n,1,buf);
}
free(buf);
if (bits<=8) {
for (i=0;i<colors;i++) {
pdib1->getpalette(i,&r,&g,&b);
pdib2->setpalette(i,r,g,b);
}
}
delete pdib1;
delete pdib2;
}
void CImageProcess::ZoomOut(int n)
{
int i,j,r,g,b;
BYTE *buf;
CDIB *pdib1,*pdib2;
int wid,hei,bits,bpl,bpp,colors;
if (m_pDib==NULL) return;
pdib1 = new CDIB(m_pDib1);
wid=pdib1->GetWidth();
hei=pdib1->GetHeight();
bits=pdib1->GetBitCount();
bpl=pdib1->GetBytesPerLine();
bpp=pdib1->GetBytesPerPixel();
colors=pdib1->GetColors();
if (bits<8) {
delete pdib1;
return;
}
if(m_pDib!=NULL) {
delete [] m_pDib;
m_pDib=NULL;
}
m_pDib=CreateDib(wid/n,hei/n,bits);
pdib2 = new CDIB(m_pDib);
buf=(BYTE*) malloc(bpl);
for (j=0;j<hei;j+=n) {
pdib1->getimage(0,j,wid,1,buf);
for (i=0;i<bpp*wid;i+=n*bpp)
memcpy(&buf[i/n],&buf[i],bpp);
pdib2->setimage(0,j/n,wid/n,1,buf);
}
free(buf);
if (bits<=8) {
for (i=0;i<colors;i++) {
pdib1->getpalette(i,&r,&g,&b);
pdib2->setpalette(i,r,g,b);
}
}
delete pdib1;
delete pdib2;
}
void CImageProcess::Scale(double alpha)
{
CDIB *pdib1,*pdib2;
int wid,hei,bits,bpl,bpp,colors;
BYTE *buf1,*buf2,*sc;
int i,j,rr,gg,bb;
int Dx,Dy,x1,x2,xx,y1,y2=0,yy,flag;
double a,b,c,d,t1,t2,t3;
if (m_pDib1==NULL) return;
pdib1 = new CDIB(m_pDib1);
wid=pdib1->GetWidth();
hei=pdib1->GetHeight();
bits=pdib1->GetBitCount();
bpl=pdib1->GetBytesPerLine();
bpp=pdib1->GetBytesPerPixel();
colors=pdib1->GetColors();
if (bits<8) {
delete pdib1;
return;
}
if(m_pDib!=NULL) {
delete [] m_pDib;
m_pDib=NULL;
}
Dx=(int) (alpha*wid);
Dy=(int) (alpha*hei);
m_pDib=CreateDib(Dx,Dy,bits);
pdib2 = new CDIB(m_pDib);
if (bpp==1) { // 256色图象
flag=0;
for (i=0;i<colors;i++) {
pdib1->getpalette(i,&rr,&gg,&bb);
pdib2->setpalette(i,rr,gg,bb);
if ((rr!=gg)||(rr!=bb)) flag=1;
}
}
else flag=1;
buf1=(BYTE*) malloc(bpl);
buf2=(BYTE*) malloc(bpl);
sc =(BYTE*) malloc(Dx*bpp+4);
for (j=0;j<Dy;j++) {
yy=(int)(j/alpha); y1=(int) yy;
yy=yy-y1;
if (y1 != y2) {
pdib1->getimage(0,y1 ,wid,1,buf1);
pdib1->getimage(0,y1+1,wid,1,buf2);
}
for (i=0;i<Dx;i++) {
xx=(int)(i/alpha); x1=(int) xx;
x2=x1+1; xx=xx-x1;
if (flag==1) {
if (xx>0.5) x1=x2;
if (yy<0.5)
memcpy(&sc[i*bpp],&buf1[x1*bpp],bpp);
else
memcpy(&sc[i*bpp],&buf2[x1*bpp],bpp);
}
else {
a=buf1[x1]; b=buf2[x1];
c=buf1[x1+1]; d=buf2[x1+1];
t1=a*(1-yy)+b*yy; t2=c*(1-yy)+d*yy;
t3=t1*(1-xx)+t2*xx;
sc[i]=(BYTE) t3;
}
}
pdib2->setimage(0,j,Dx,1,sc);
y2=y1;
}
free(buf1);
free(buf2);
free(sc);
delete pdib1;
delete pdib2;
}
BOOL CImageProcess::PointInDib(int x,int y)
{
CDIB *pdib;
BYTE *p;
pdib = new CDIB(m_pDib);
p=pdib->DibAddress(x,y);
delete pdib;
if (p==0) return(FALSE);
else return(TRUE);
}
void CImageProcess::SetHWnd(HWND hWnd)
{
hWndView=hWnd;
}
void CImageProcess::OkCapture(HWND hWnd)
{
#ifdef Capture
long size;
if (CaptureFlag) {
OkCap.OpenCard(hWnd,&Wid,&Hei);
if (Wid>CaptureWidth) Wid=CaptureWidth;
if (Hei>CaptureHeight) Hei=CaptureHeight;
OkCap.SetSize(hWnd,0,0,Wid,Hei);
}
else return;
if(m_pDib!=NULL) delete [] m_pDib;
m_pDib=CreateDib(Wid,Hei,24);
SetDibParam(m_pDib);
OkCap.CaptToVideo(0);
OkCap.VideoToDib(m_pBits,wid,hei,bits);
if(m_pDib1!=NULL) delete [] m_pDib1;
m_pDib1=CreateDib(wid,hei,bits);
size=40L+colors*4+((31+wid*bits)/32*4)*hei;
memcpy(m_pDib1,m_pDib,size);
#endif
}
void CImageProcess::SingleCapto(HWND hWnd)
{
#ifdef Capture
long size;
if (CaptureFlag) {
OkCap.SetSize(hWnd,0,0,CaptureWidth,CaptureHeight);
}
else return;
OkCap.CaptToBuffer(0);
if(m_pDib!=NULL) delete [] m_pDib;
m_pDib=CreateDib(CaptureWidth,CaptureHeight,24);
SetDibParam(m_pDib);
OkCap.BufferToDib(m_pBits,wid,hei,bits);
if(m_pDib1!=NULL) delete [] m_pDib1;
m_pDib1=CreateDib(wid,hei,bits);
size=40L+colors*4+((31+wid*bits)/32*4)*hei;
memcpy(m_pDib1,m_pDib,size);
#endif
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -