📄 vcimageview.cpp
字号:
max=maxn=0;
for (i=0;i<256;i++) {
pdib2->getpalette(i,&r,&g,&b);
gray=(int) (0.30*r+0.59*g+0.11*b+0.5);
if (gray>max) {
maxn=i;
max=gray;
}
pdib1->setpalette(i,r,g,b);
}
cp=(BYTE*) &maxn;
}
else {
dd=BGR(236,236,236);
cp=(BYTE*) ⅆ
}
if (area_na==0) {
for (i=R0.y;i<R1.y;i++) {
for (j=0,k=0;j<R1.x-R0.x;j++,k+=bpp) {
memcpy(&buf2[k],cp,bpp);
}
pdib1->setimage(R0.x,i,R1.x-R0.x,1,buf2);
}
}
else {
for (i=0;i<area_na;i+=2) {
s=area_pa[i+1].x-area_pa[i].x+1;
for (j=0,k=0;j<s;j++,k+=bpp) {
memcpy(&buf2[k],cp,bpp);
}
pdib1->setimage(area_pa[i].x,area_pa[i].y,s,1,buf2);
}
}
delete pdib1;
delete pdib2;
}
Invalidate();
}
void CVCImageView::OnMove(void)
{
CVCImageDoc* pDoc = GetDocument();
if (pDoc->m_Process.GetPDib(0)==NULL) return;
rect_flag=0;
area_flag=0;
move_flag=1;
}
void CVCImageView::MoveImage(int X,int Y,int f)
{
int i,j,k,s,x,y,x1,y1,d;
int xx,yy,dd,pal[256][3];
int wid,hei,bpp,bpl;
CDIB *pdib2,*pdib1;
BYTE *buf,*p0,*p1;
CClientDC dc(this);
CVCImageDoc* pDoc = GetDocument();
x =X-moveX0;
y =Y-moveY0;
if (f==0) {
x1=x; y1=y; d=2;
}
else {
x1=y1=d=0;
}
p0=pDoc->m_Process.GetPDib(0);
p1=pDoc->m_Process.GetPDib(1);
if (p1!=NULL) {
pdib2= new CDIB(p1);
pdib1= new CDIB(p0);
wid=pdib2->wid;
hei=pdib2->hei;
bpl=pdib2->bpl;
bpp=pdib2->bpp;
buf=(BYTE*) malloc(bpl);
if (bpp==1) {
for (i=0;i<256;i++)
pdib2->getpalette(i,&pal[i][0],
&pal[i][1],&pal[i][2]);
}
if (area_na>0) {
k=0;
for (i=0;i<area_na;i+=2) {
s=area_pa[i+1].x-area_pa[i].x+1+2*d;
pdib2->getimage(x1+area_pa[i].x-d,
y1+area_pa[i].y,s,1,buf);
pdib1->setimage(x +area_pa[i].x-d,
y +area_pa[i].y,s,1,buf);
xx=x +area_pa[i].x-d;
yy=y +area_pa[i].y;
if ((xx>=wid)||(yy>=hei)) s=0;
else if (xx+s>=wid) s=wid-xx;
for (j=0,k=0;j<s;j++,k+=bpp) {
if (bpp==1)
dd=RGB(pal[buf[k]][0],pal[buf[k]][1],
pal[buf[k]][2]);
else
dd=RGB(buf[k+2],buf[k+1],buf[k]);
dc.SetPixel(xx+j,yy,dd);
}
}
}
if (area_na==0) {
for (i=R0.y-d;i<R1.y+d;i++) {
pdib2->getimage(x1+R0.x-d,y1+i,R1.x-R0.x+d+d,1,buf);
pdib1->setimage(x +R0.x-d,y +i,R1.x-R0.x+d+d,1,buf);
xx=x +R0.x-d; yy=y +i;
s=R1.x-R0.x+d+d;
if ((xx>=wid)||(yy>=hei)) s=0;
else if (xx+s>=wid) s=wid-xx;
for (j=0,k=0;j<s;j++,k+=bpp) {
if (bpp==1)
dd=RGB(pal[buf[k]][0],pal[buf[k]][1],pal[buf[k]][2]);
else
dd=RGB(buf[k+2],buf[k+1],buf[k]);
dc.SetPixel(xx+j,yy,dd);
}
}
}
free(buf);
delete pdib1;
delete pdib2;
}
}
void CVCImageView::OnSize(UINT nFlags, CPoint point)
{
// TODO: add construction code here
CVCImageDoc* pDoc = GetDocument();
pDoc->m_Process.SetHWnd(m_hWnd);
}
void CVCImageView::OnLButtonDown(UINT nFlags, CPoint point)
{
if ((rect_flag+area_flag+move_flag==1)&&
(PointInDib(point.x,point.y)==NULL)) return;
if (move_flag==1) {
moveX0=point.x; moveY0=point.y;
moveX=point.x; moveY=point.y;
move_flag=2;
return;
}
if ((rect_flag==1)&&(rect_n==0)) {
rect_p[0].x=point.x;
rect_p[0].y=point.y;
rect_n=1;
}
if ((area_flag==1)&&(area_n==0)) {
area_p[0].x=point.x;
area_p[0].y=point.y;
area_n=1;
}
CScrollView::OnLButtonDown(nFlags, point);
}
void CVCImageView::OnMouseMove(UINT nFlags, CPoint point)
{
CClientDC dc(this);
int nOldRop;
if ((rect_flag+area_flag+move_flag==1)&&
(PointInDib(point.x,point.y)==NULL)) return;
if (move_flag==2) {
if (abs(moveX-point.x)+abs(moveY-point.y)<3) return;
MoveImage(moveX,moveY,0);
MoveImage(point.x,point.y,1);
moveX=point.x; moveY=point.y;
return;
}
nOldRop=dc.SetROP2(R2_NOTXORPEN);
if ((rect_flag==1)&&(rect_n>0)) {
if (rect_n==2) {
dc.MoveTo(rect_p[0].x,rect_p[0].y);
dc.LineTo(rect_p[1].x,rect_p[0].y);
dc.LineTo(rect_p[1].x,rect_p[1].y);
dc.LineTo(rect_p[0].x,rect_p[1].y);
dc.LineTo(rect_p[0].x,rect_p[0].y);
}
rect_p[1].x=point.x;
rect_p[1].y=point.y;
rect_n=2;
dc.MoveTo(rect_p[0].x,rect_p[0].y);
dc.LineTo(rect_p[1].x,rect_p[0].y);
dc.LineTo(rect_p[1].x,rect_p[1].y);
dc.LineTo(rect_p[0].x,rect_p[1].y);
dc.LineTo(rect_p[0].x,rect_p[0].y);
}
if ((area_flag==1)&&(area_n>0)) {
if (abs(area_p[area_n-1].x-point.x)+
abs(area_p[area_n-1].y-point.y)>2) {
area_p[area_n].x=point.x;
area_p[area_n].y=point.y;
area_n++;
dc.MoveTo(area_p[area_n-2].x,area_p[area_n-2].y);
dc.LineTo(area_p[area_n-1].x,area_p[area_n-1].y);
}
}
dc.SetROP2(nOldRop);
CScrollView::OnMouseMove(nFlags, point);
}
void CVCImageView::OnLButtonUp(UINT nFlags, CPoint point)
{
CClientDC dc(this);
int nOldRop;
int t;
if ((rect_flag+area_flag+move_flag==1)&&
(PointInDib(point.x,point.y)==NULL)) return;
if (move_flag==2) {
MoveImage(moveX,moveY,0);
MoveImage(point.x,point.y,1);
moveX=point.x; moveY=point.y;
move_flag=0;
Invalidate();
return;
}
nOldRop=dc.SetROP2(R2_NOTXORPEN);
if (rect_flag==1) {
R0.x=rect_p[0].x;
R0.y=rect_p[0].y;
R1.x=rect_p[1].x;
R1.y=rect_p[1].y;
if (R0.x>R1.x) {
t=R0.x; R0.x=R1.x; R1.x=t;
}
if (R0.y>R1.y) {
t=R0.y; R0.y=R1.y; R1.y=t;
}
area_na=0;
rect_flag=0;
}
if (area_flag==1) {
if (abs(area_p[0].x-point.x)+
abs(area_p[0].y-point.y)!=0) {
area_p[area_n].x=area_p[0].x;
area_p[area_n].y=area_p[0].y;
area_n++;
dc.MoveTo(area_p[area_n-2].x,area_p[area_n-2].y);
dc.LineTo(area_p[area_n-1].x,area_p[area_n-1].y);
}
dot_n=LineToCode(area_p,dot);
if (dot_n!=-1) {
area_na=CodeToTable(dot,area_pa);
}
else area_na=0;
area_flag=0;
}
dc.SetROP2(nOldRop);
CScrollView::OnLButtonUp(nFlags, point);
}
int CVCImageView::LineCoor(int x,int y,int x1,int y1,POINT *dot)
{
int t,dis,dx,dy,xerr=1,yerr=1,incx,incy;
dx=x1-x; dy=y1-y;
if (dx>0) incx=1;
else if (dx==0) incx=0;
else incx=-1;
if (dy>0) incy=1;
else if (dy==0) incy=0;
else incy=-1;
dx=abs(dx); dy=abs(dy);
if (dx>dy) dis=dx;
else dis=dy;
for (t=0;t<dis+1;t++) {
dot->x=x; dot->y=y;
dot++;
xerr+=dx; yerr+=dy;
if (xerr>dis) {
xerr-=dis; x+=incx;
}
if (yerr>dis) {
yerr-=dis; y+=incy;
}
}
return(dis+1);
}
int CVCImageView::LineToCode(POINT *area_p,int *dot)
{
POINT *ddot;
int i,k,x,y,dx,dy,ddot_n;
int tab[3][3]={{5,6,7},{4,0,0},{3,2,1}};
ddot=(POINT *) new char[MAX_NUM*sizeof(POINT)];
if (ddot==NULL) MessageBeep(0);
ddot_n=0;
for (i=0;i<area_n-1;i++) {
x=area_p[i].x; y=area_p[i].y;
k=LineCoor(x,y,area_p[i+1].x,area_p[i+1].y,&ddot[ddot_n]);
ddot_n+=(k-1);
if (ddot_n>MAX_NUM-5) {
return(-1);
}
}
ddot[ddot_n].x=ddot[0].x;
ddot[ddot_n].y=ddot[0].y;
dot[0]=ddot[0].x;
dot[1]=ddot[0].y;
for (i=0,k=3;i<ddot_n;i++) {
dx=ddot[i+1].x-ddot[i].x+1;
dy=ddot[i+1].y-ddot[i].y+1;
dot[k++]=tab[dy][dx];
}
dot[2]=k-3;
delete ddot;
return(ddot_n);
}
int CVCImageView::CodeToTable(int *dot,POINT *area_p)
{
int inc[8][2] = {
{+1, 0},{+1,+1},{ 0,+1},{-1,+1},
{-1, 0},{-1,-1},{ 0,-1},{+1,-1} };
int nn[8][8]={
/* 0 1 2 3 4 5 6 7 */
{0,2,2,2,2,0,0,0}, /* 0 */
{0,2,2,2,2,3,0,0}, /* 1 */
{0,2,2,2,2,3,3,0}, /* 2 */
{0,2,2,2,2,3,3,3}, /* 3 */
{1,0,0,0,0,1,1,1}, /* 4 */
{1,3,0,0,0,1,1,1}, /* 5 */
{1,3,3,0,0,1,1,1}, /* 6 */
{1,3,3,3,0,1,1,1} }; /* 7 */
int i,j,n,k,k1,ki,kj,d,dot_n1,max,min;
int *buff0,*buff1,nb;
buff0=(int*) new int[MAX_NUM*sizeof(int)];
buff1=(int*) new int[MAX_NUM*sizeof(int)];
nb=0;
n =dot[2];
if (n == -1) return -1;
dot[n+3]=dot[3];
ki=dot[0]; kj=dot[1];
for (i=3;i<n+3;i++) {
k=dot[i]; k1=dot[i+1];
d=nn[k][k1];
ki+=inc[k][0]; kj+=inc[k][1];
if (d!=0) {
buff0[nb]=ki; buff1[nb++]=kj;
if (d==3) {
buff0[nb]=ki; buff1[nb++]=kj;
}
}
}
max=0; min=1200;
for (i=0;i<nb;i++) {
if (buff1[i]>max) max=buff1[i];
if (buff1[i]<min) min=buff1[i];
}
dot_n1=0;
for (i=min;i<=max;i++) {
for (j=0;j<nb;j++) {
if (buff1[j]!=i) continue;
area_p[dot_n1].x = buff0[j];
area_p[dot_n1++].y = i;
}
}
area_p[dot_n1].x=0;
area_p[dot_n1].y=0;
for (i=0;i<dot_n1;i++) {
kj=area_p[i].y;
for (n=i+1;kj==area_p[n].y;n++) {}
n--;
for (j=i;j<n;j++) {
for (k=n-1;k>=j;k--) {
if (area_p[k].x>area_p[k+1].x) {
ki=area_p[k].x;
area_p[k].x=area_p[k+1].x;
area_p[k+1].x=ki;
}
}
}
i=n;
}
delete buff0;
delete buff1;
if (dot_n1%2) dot_n1--;
return(dot_n1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -