www.gusucode.com > VC++增强型“画图版”及图像处理程序源码程序 > VC++增强型“画图版”及图像处理程序源码程序\code\BmpDat.cpp

    // BmpDat.cpp: implementation of the CBmpDat class.
// Download by http://www.NewXing.com
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "毕业设计.h"
#include "BmpDat.h"

#include <time.h>
#include <stdlib.h>
#include <math.h>

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

extern CStatusBar * mmcsb;
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CBmpDat::CBmpDat(CDC * dc){
	undo = 0;
	redo = 2;
	width = 0;
	height = 0;
	path = _T("");
	bgcol = RGB(255,255,255);
	pecol = RGB(0,0,0);
	pdc.CreateCompatibleDC(dc);
	bfdc.CreateCompatibleDC(dc);
	mdc[0].CreateCompatibleDC(dc);
	mdc[1].CreateCompatibleDC(dc);
	CBitmap *obp;
//	bp.CreateCompatibleBitmap(dc,1024,786);
	bp.LoadBitmap(IDB_BBB);
	////////////////////////////////////将位图选入DC
	obp = pdc.SelectObject(&bp);
	obp->DeleteObject();
	//////////////////////////////////////创建一个白色画笔
//	CPen pen,*op;
//	pen.CreatePen(PS_SOLID,796,RGB(255,255,255));
	//////////////////////////////////////使用白色画笔
//	op = pdc.SelectObject(&pen);
	//////////////////////////////////////
//	pdc.MoveTo(0,393);
//	pdc.LineTo(1024,393);
	////////////////////////////////////////
//	pdc.SelectObject(op);
	pdc.SetTextColor(pecol);
	pdc.SetBkMode(0);

	//////////////////////////
	CBitmap *obp2;
//	bp2.CreateCompatibleBitmap(dc,1024,786);
	bp2.LoadBitmap(IDB_BBB);
	////////////////////////////////////将位图选入DC
	obp2 = bfdc.SelectObject(&bp2);
	obp2->DeleteObject();

	CBitmap *obp3;
//	bp3.CreateCompatibleBitmap(dc,1024,786);
	bp3.LoadBitmap(IDB_BBB);
	////////////////////////////////////将位图选入DC
	obp3 = mdc[0].SelectObject(&bp3);
	obp3->DeleteObject();

	CBitmap *obp4;
//	bp4.CreateCompatibleBitmap(dc,1024,786);
	bp4.LoadBitmap(IDB_BBB);
	////////////////////////////////////将位图选入DC
	obp4 = mdc[1].SelectObject(&bp4);
	obp4->DeleteObject();

//	pen.DeleteObject();
}

CBmpDat::~CBmpDat(){
}

//////////////
void CBmpDat::Cancel(){
	pdc.BitBlt(0,0,width,height,&bfdc,0,0,SRCCOPY);
	for(int i = 0;i<width;i++){
		for(int j = 0;j<height;j++){
			pix[0][i][j] = bfpix[0][i][j];
			pix[1][i][j] = bfpix[1][i][j];
			pix[2][i][j] = bfpix[2][i][j];
		}
	}
}
///////////////////////////////////////////////
void CBmpDat::BeiFen(){
	int i,j;
	if(undo==2){
		undo--;
		mdc[0].BitBlt(0,0,width,height,&mdc[1],0,0,SRCCOPY);
		for(i = 0;i<width;i++){
			for(j = 0;j<height;j++){
				mpix[0][0][i][j] = mpix[1][0][i][j];
				mpix[0][1][i][j] = mpix[1][1][i][j];
				mpix[0][2][i][j] = mpix[1][2][i][j];
			}
		}
		lastw[0] = lastw[1];
		lasth[0] = lasth[1];
	}
	mdc[undo].BitBlt(0,0,width,height,&bfdc,0,0,SRCCOPY);
	for(i = 0;i<width;i++){
		for(j = 0;j<height;j++){
			mpix[undo][0][i][j] = bfpix[0][i][j];
			mpix[undo][1][i][j] = bfpix[1][i][j];
			mpix[undo][2][i][j] = bfpix[2][i][j];
		}
	}
	bfdc.BitBlt(0,0,width,height,&pdc,0,0,SRCCOPY);
	for(i = 0;i<width;i++){
		for(j = 0;j<height;j++){
			bfpix[0][i][j] = pix[0][i][j];
			bfpix[1][i][j] = pix[1][i][j];
			bfpix[2][i][j] = pix[2][i][j];
		}
	}
	lastw[undo] = width;
	lasth[undo] = height;
	undo ++;
	redo = 2;
}

void CBmpDat::UnDo(){
	if(!UnDoOK())
		return;
	int i,j;
	int ow,oh;
	undo --;
	redo --;
	ow = width;
	oh = height;
	width = lastw[undo];
	height = lasth[undo];
	int tw,th;
	tw = ow>width?ow:width;
	th = oh>height?oh:height;
	pdc.BitBlt(0,0,tw,th,&mdc[undo],0,0,SRCCOPY);
	for(i = 0;i<tw;i++){
		for(j = 0;j<th;j++){
			pix[0][i][j] = mpix[undo][0][i][j];
			pix[1][i][j] = mpix[undo][1][i][j];
			pix[2][i][j] = mpix[undo][2][i][j];
		}
	}
	mdc[undo].BitBlt(0,0,tw,th,&bfdc,0,0,SRCCOPY);
	for(i = 0;i<tw;i++){
		for(j = 0;j<th;j++){
			mpix[undo][0][i][j] = bfpix[0][i][j];
			mpix[undo][1][i][j] = bfpix[1][i][j];
			mpix[undo][2][i][j] = bfpix[2][i][j];
		}
	}
	bfdc.BitBlt(0,0,tw,th,&pdc,0,0,SRCCOPY);
	for(i = 0;i<tw;i++){
		for(j = 0;j<th;j++){
			bfpix[0][i][j] = pix[0][i][j];
			bfpix[1][i][j] = pix[1][i][j];
			bfpix[2][i][j] = pix[2][i][j];
		}
	}
	lastw[undo] = ow;
	lasth[undo] = oh;
//	oldwidth = width;
//	oldheight = height;
}
void CBmpDat::ReDo(){
	if(!ReDoOK())
		return;
	int i,j;
	int ow,oh;
	ow = width;
	oh = height;
	width = lastw[undo];
	height = lasth[undo];
	int tw,th;
	tw = ow>width?ow:width;
	th = oh>height?oh:height;
	pdc.BitBlt(0,0,tw,th,&mdc[undo],0,0,SRCCOPY);
	for(i = 0;i<tw;i++){
		for(j = 0;j<th;j++){
			pix[0][i][j] = mpix[undo][0][i][j];
			pix[1][i][j] = mpix[undo][1][i][j];
			pix[2][i][j] = mpix[undo][2][i][j];
		}
	}
	mdc[undo].BitBlt(0,0,tw,th,&bfdc,0,0,SRCCOPY);
	for(i = 0;i<tw;i++){
		for(j = 0;j<th;j++){
			mpix[undo][0][i][j] = bfpix[0][i][j];
			mpix[undo][1][i][j] = bfpix[1][i][j];
			mpix[undo][2][i][j] = bfpix[2][i][j];
		}
	}
	bfdc.BitBlt(0,0,tw,th,&pdc,0,0,SRCCOPY);
	for(i = 0;i<tw;i++){
		for(j = 0;j<th;j++){
			bfpix[0][i][j] = pix[0][i][j];
			bfpix[1][i][j] = pix[1][i][j];
			bfpix[2][i][j] = pix[2][i][j];
		}
	}
	lastw[undo] = ow;
	lasth[undo] = oh;
	undo ++;
	redo ++;
}
////////////////////////////////////////////////////
int CBmpDat::Save(CString p){
	if(p.GetLength()>0){
		path = p;
	}
	if(path.GetLength()==0){
		CFileDialog ff(false,NULL,NULL,OFN_OVERWRITEPROMPT,"*.bmp|*.bmp|",NULL);
		if(ff.DoModal()==IDOK){
			path = ff.GetPathName();
			StringEnd(path,".bmp");
		}
		else{
			return -1;
		}
	}
	CDC memDC;
	memDC.CreateCompatibleDC(&pdc);
	CBitmap bm;
	bm.CreateCompatibleBitmap(&pdc, width, height);
	CBitmap*  pOld = memDC.SelectObject(&bm);
	memDC.BitBlt(0, 0, width, height, &pdc, 0, 0, SRCCOPY);
	memDC.SelectObject(pOld);
	BITMAP  btm;
	bm.GetBitmap(&btm);
	DWORD  size = btm.bmWidthBytes * btm.bmHeight;
	LPSTR lpData = (LPSTR)GlobalAlloc(GPTR, size);
	BITMAPFILEHEADER   bfh;
	/////////////////////////////////////////////
	BITMAPINFOHEADER  bih;
	bih.biBitCount = btm.bmBitsPixel;
	bih.biClrImportant = 0;
	bih.biClrUsed = 0;
	bih.biCompression = 0;
	bih.biHeight = btm.bmHeight;
	bih.biPlanes = 1;
	bih.biSize = sizeof(BITMAPINFOHEADER);
	bih.biSizeImage = size;
	bih.biWidth = btm.bmWidth;
	bih.biXPelsPerMeter = 0;
	bih.biYPelsPerMeter = 0;
	GetDIBits(pdc,bm,0,bih.biHeight,lpData,(BITMAPINFO*)&bih,DIB_RGB_COLORS);
	//bm.GetBitmapBits(size,lpData);//此函数在处理5-5-5模式的16位色下会出现颜色混乱
	bfh.bfReserved1 = bfh.bfReserved2 = 0;
	bfh.bfType = ((WORD)('M'<< 8)|'B');
	bfh.bfSize = 54 + size;
	bfh.bfOffBits = 54;

	CFile  bf;
	if(bf.Open(path,CFile::modeCreate|CFile::modeWrite))	{
		bf.WriteHuge(&bfh, sizeof(BITMAPFILEHEADER));
		bf.WriteHuge(&bih, sizeof(BITMAPINFOHEADER));
		bf.WriteHuge(lpData, size);
		bf.Close();
	}
	GlobalFree (lpData);
	return 0;
}

void CBmpDat::New(int w,int h){
	int i,j;
	/////////////////////////////////////创建一个DC
	/////////////////////////////////////创建一个位图
	CBitmap *bp,*obp;
	bp = new CBitmap;
//	bp->CreateCompatibleBitmap(&pdc,1024,786);
	bp->LoadBitmap(IDB_BBB);
	////////////////////////////////////将位图选入DC
	obp = pdc.SelectObject(bp);
	obp->DeleteObject();
	//////////////////////////////////////创建一个白色画笔
//	CPen pen,*op;
//	pen.CreatePen(PS_SOLID,796,RGB(255,255,255));
	//////////////////////////////////////使用白色画笔
//	op = pdc.SelectObject(&pen);
	//////////////////////////////////////
//	pdc.MoveTo(0,393);
//	pdc.LineTo(1024,393);
	////////////////////////////////////////
//	pdc.SelectObject(op);
//	pen.DeleteObject();

	///////////////////////////
	path = _T("");
	height = h>786?786:h;
	width = w>1024?1024:w;
	oldheight = h>786?786:h;
	oldwidth = w>1024?1024:w;
	for(i = 0;i<1024;i++){
		for(j = 0;j<786;j++){
			pix[0][i][j] = 255;
			pix[1][i][j] = 255;
			pix[2][i][j] = 255;
			bfpix[0][i][j] = 255;
			bfpix[1][i][j] = 255;
			bfpix[2][i][j] = 255;
			mpix[0][0][i][j] = 255;
			mpix[0][1][i][j] = 255;
			mpix[0][2][i][j] = 255;
			mpix[1][0][i][j] = 255;
			mpix[1][1][i][j] = 255;
			mpix[1][2][i][j] = 255;
		}
	}
	BeiFen();
	undo = 0;
	redo = 2;
}


void CBmpDat::Open(CString p){
	/////读取位图文件
	int i,j;
	HBITMAP bitmap;
	CFile file;
	if(file.Open(p,CFile::modeRead|CFile::shareDenyNone)){//打开文件
		j = width;
		BITMAPINFO bmpinfo;
		BITMAPFILEHEADER bmphead;
		file.Read(&bmphead,sizeof(BITMAPFILEHEADER));
		file.Read(&bmpinfo,sizeof(BITMAPINFO));
		width = bmpinfo.bmiHeader.biWidth;
		height = bmpinfo.bmiHeader.biHeight;
		oldwidth = width;
		oldheight = height;
		file.Close();
	}
	else{
		AfxMessageBox("打开文件失败!");
		return;
	}
	bitmap=(HBITMAP)LoadImage(AfxGetInstanceHandle(),p,IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);
	ASSERT(bitmap);

	New(width,height);
	CDC mdc;
	mdc.CreateCompatibleDC(&pdc);
	mdc.SelectObject(bitmap);
	pdc.BitBlt(0,0,width,height,&mdc,0,0,SRCCOPY);

	path = p;
	COLORREF clr;
	CString str;
	for(i = 0;i<width;i++){
		for(j = 0;j<height;j++){
			clr = pdc.GetPixel(i,j);
			pix[0][i][j] = GetRValue(clr);
			pix[1][i][j] = GetGValue(clr);
			pix[2][i][j] = GetBValue(clr);
			bfpix[0][i][j] = pix[0][i][j];
			bfpix[1][i][j] = pix[1][i][j];
			bfpix[2][i][j] = pix[2][i][j];
		}
		str.Format("已完成%d%%",i*100/width);
		mmcsb->SetWindowText(str);
	}
	BeiFen();
	mmcsb->SetWindowText("就绪");
	undo = 0;
	redo = 2;
}

//////////////////////边缘提取///////////////////////////////
void CBmpDat::BY(){
	BeiFen();
	HDTX(0);
	CString str;
	int i,j;
	for(i = 0;i<width;i++){
		for(j = 0;j<height;j++){
			pix[0][i][j] = BY(0,i,j);
			pix[1][i][j] = BY(1,i,j);
			pix[2][i][j] = BY(2,i,j);
			pdc.SetPixel(i,j,RGB(pix[0][i][j],pix[1][i][j],pix[2][i][j]));
		}
		str.Format("已完成%d%%",i*100/width);
		mmcsb->SetWindowText(str);
	}
	for(i = 0;i<width;i++){
		for(j = 0;j<height;j++){
			bfpix[0][i][j] = pix[0][i][j];
			bfpix[1][i][j] = pix[1][i][j];
			bfpix[2][i][j] = pix[2][i][j];
		}
	}
	bfdc.BitBlt(0,0,width,height,&pdc,0,0,SRCCOPY);
	mmcsb->SetWindowText("就绪");
}
BYTE CBmpDat::BY(int i,int x,int y){
	int t1 = 0,t2 = 0,t3 = 0,t4 = 0,t;
	if(x>0){
		t1 = bfpix[i][x-1][y]-bfpix[i][x][y];
		if(t1<0){t1 = -t1;}
		if(y>0){
			t2 = bfpix[i][x-1][y-1]-bfpix[i][x][y];
			if(t2<0){t2 = -t2;}
		}
	}
	if(x<width-1){
		t3 = bfpix[i][x+1][y]-pix[i][x][y];
		if(t3<0){t3 = -t3;}
		if(y<height-1){
			t4 = bfpix[i][x+1][y+1]-bfpix[i][x][y];
			if(t4<0){t4 = -t4;}
		}
	}
	t = t1+t2+t3+t4;
	return t>255?255:t;
}

///////////////////////////浮雕/////////////////////////////////
void CBmpDat::FD(){
	BeiFen();
	HDTX(0);
	CString str;
	int i,j;
	for(i = 0;i<width;i++){
		for(j = 0;j<height;j++){
			pix[0][i][j] = FD(0,i,j);
			pix[1][i][j] = FD(1,i,j);
			pix[2][i][j] = FD(2,i,j);
			pdc.SetPixel(i,j,RGB(pix[0][i][j],pix[1][i][j],pix[2][i][j]));
		}
		str.Format("已完成%d%%",i*100/width);
		mmcsb->SetWindowText(str);
	}
	for(i = 0;i<width;i++){
		for(j = 0;j<height;j++){
			bfpix[0][i][j] = pix[0][i][j];
			bfpix[1][i][j] = pix[1][i][j];
			bfpix[2][i][j] = pix[2][i][j];
		}
	}
	bfdc.BitBlt(0,0,width,height,&pdc,0,0,SRCCOPY);
	mmcsb->SetWindowText("就绪");
}
BYTE CBmpDat::FD(int i,int x,int y){
	int t = 0;
	if(x<width-2){
		if(y<height){
			t = bfpix[i][x][y] - bfpix[i][x+2][y+1] + 125;
		}
		else{
			t = bfpix[i][x][y-1] - bfpix[i][x+2][y] + 125;
		}
	}
	else if(x<width-1){
		if(y<height){
			t = bfpix[i][x][y] - bfpix[i][x+1][y+1] + 125;
		}else{
			t = bfpix[i][x][y-1] - bfpix[i][x+1][y] + 125;
		}
	}
	else{
		if(y<height){
			t = bfpix[i][x-1][y] - bfpix[i][x][y+1] + 125;
		}else{
			t = bfpix[i][x-1][y-1] - bfpix[i][x][y] + 125;
		}
	}
	if(t<0){t = 0;}
	if(t>255){t = 255;}
	return t;
}


//////////////////////////去噪////////////////////////////
int Mid(int n,int c[]){
	int m = n / 2;
	for(int i = 0;i<m+1;i++){
		for(int j = 0;j<n-i-1;j++){
			if(c[j]>c[j+1]){
				int t = c[j];c[j] = c[j+1];c[j+1] = t;
			}
		}
	}
	return c[m];
}
BYTE CBmpDat::LB(int i,int x,int y,int z){
	int tn[9];
	int n = 0;
	if(x>0){
		if(y>0){
			tn[n++] = bfpix[i][x-1][y-1];
		}
		tn[n++] = bfpix[i][x-1][y];
		if(y<height-1){
			tn[n++] = bfpix[i][x-1][y+1];
		}
	}
	if(y>0){
		tn[n++] = bfpix[i][x][y-1];
	}
	tn[n++] = bfpix[i][x][y];
	if(y<height-1){
		tn[n++] = bfpix[i][x][y+1];
	}
	if(x<width-1){
		if(y>0){
			tn[n++] = bfpix[i][x+1][y-1];
		}
		tn[n++] = bfpix[i][x+1][y];
		if(y<height-1){
			tn[n++] = bfpix[i][x+1][y+1];
		}
	}
	int t1,t2;
	t1 = Mid(n,tn);
	t2 = t1 - bfpix[i][x][y];
	if(t2<-z||t2>z){
		return t1;
	}
	else{
		return bfpix[i][x][y];
	}
}
///////////////////模糊////////////////////////
BYTE CBmpDat::MH(int i,int x,int y){
	int temp = 2*(int)(bfpix[i][x][y]);
	int n = 2;
	if(x>0){
		if(y>0){
			temp += (int)bfpix[i][x-1][y-1];
			n++;
		}
		temp += int(bfpix[i][x-1][y]);
		n ++;
		if(y<height-1){
			temp += int(bfpix[i][x-1][y+1]);
			n++;
		}
	}
	if(y>0){
		temp += int(bfpix[i][x][y-1]);
		n ++;
	}
	if(y<height-1){
		temp += int(bfpix[i][x][y+1]);
		n ++;
	}
	if(x<width-1){
		if(y>0){
			temp += int(bfpix[i][x+1][y-1]);
			n ++;
		}
		temp += int(bfpix[i][x+1][y]);
		n ++;
		if(y<height-1){
			temp += int(bfpix[i][x+1][y+1]);
			n ++;
		}
	}
	return BYTE(temp/n);
}

//////////////////////////亮度变化//////////////////////////////
BYTE CBmpDat::LA(int i,int x,int y,int z,int c){//c==1增加,c==0减少
	int n = 255 - z;
	int t = bfpix[i][x][y];
	if(c){
		t = z + t*(255 - z)/255;
	}
	else{
		t = t*z/255;
	}
	return t;
}

///////////////////////////设置画笔/////////////////////
void CBmpDat::SetPen(COLORREF col){
	pecol = col;
	CPen * p, * op;
	p = new CPen;
	p->CreatePen(PS_SOLID,1,pecol);
	op = pdc.SelectObject(p);
	op->DeleteObject();
	pdc.SetTextColor(col);
}
///////////////////////////////////种子填充算法//////////////////////////////////////
void CBmpDat::TC(int x,int y,int m){
	BYTE ** sp;
	int i,j;
	/////////////作标记//////////////
	sp = new BYTE*[width];
	for(i = 0;i<width;i++){
		sp[i] = new BYTE[height];
		for(j = 0;j<height;j++){
			sp[i][j] = 1;
		}
	}
	////////////////////////////////
	COLORREF col = pecol;
	CPen pen,*open;
	if(m)
		col = bgcol;
	pen.CreatePen(PS_SOLID,1,col);
	open = pdc.SelectObject(&pen);
	
	int sx[100],sy[100],top = 0;//栈
	int tr,tg,tb;//待填充色,
	int fr,fg,fb;//填充色
	fr = GetRValue(col);
	fg = GetGValue(col);
	fb = GetBValue(col);
	tr = pix[0][x][y];
	tg = pix[1][x][y];
	tb = pix[2][x][y];
	if(tr == fr&&tg == fg&&tb == fb){//颜色相等则不用填充
		return;
	}

	///////////////////////////////
	for(i = x;i>=0&&tr==pix[0][i][y]&&tg==pix[1][i][y]&&tb==pix[2][i][y];i--);//找到最左端的点
	sx[top] = i+1;sy[top] = y;top++;
	int lx,ly;
	while(top>0){//栈非空时填充
		////////////////////出栈
		lx = sx[top - 1];
		ly = sy[top - 1];
		top --;
		///////////////////填充
		if(sp[lx][ly]){
			for(i = lx;i<width&&pix[0][i][ly]==tr&&pix[1][i][ly]==tg&&pix[2][i][ly]==tb;i++){
				pix[0][i][ly] = fr;
				pix[1][i][ly] = fg;
				pix[2][i][ly] = fb;
//				bfpix[0][i][ly] = fr;
//				bfpix[1][i][ly] = fg;
//				bfpix[2][i][ly] = fb;
				sp[i][ly] = 0;
			}
			pdc.MoveTo(lx,ly);
			pdc.LineTo(i,ly);
			//////////////////////////////////////上看
			for(j = i-1;ly>=0&&j>=lx;j--){
				if(pix[0][j][ly-1]==tr&&pix[1][j][ly-1]==tg&&pix[2][j][ly-1]==tb){
					for(;j>=0&&pix[0][j][ly-1]==tr&&pix[1][j][ly-1]==tg&&pix[2][j][ly-1]==tb;j--);
					sx[top] = j+1;
					sy[top] = ly-1;
					top ++;
				}
			}
			//////////////////////////////////////下看
			for(j = i-1;ly<height&&j>=lx;j--){
				if(pix[0][j][ly+1]==tr&&pix[1][j][ly+1]==tg&&pix[2][j][ly+1]==tb){
					for(;j>=0&&pix[0][j][ly+1]==tr&&pix[1][j][ly+1]==tg&&pix[2][j][ly+1]==tb;j--);
					sx[top] = j+1;
					sy[top] = ly+1;
					top ++;
				}
			}
		}
	}
//	bfdc.BitBlt(0,0,width,height,&pdc,0,0,SRCCOPY);
	pdc.SelectObject(open);
}
///////////////////////////以下是基本操作////////////////////////////////////////

////////////////////////////Bezier曲线///////////////////////////////
int End(float x1,float y1,float x2,float y2,float x3,float y3){
	if(x3-x2<1.0000 && x3-x2>-1.00 && y3-y2<1.0000 && y3-y2>-1.0){
		if(x1-x3<1.0000 && x1-x3>-1.0 && y1-y3<1.0 && y1-y3>-1.0){
			return 1;
		}
	}
	return 0;
}
////////////////////////
void CBmpDat::DrawBezier(float x[4],float y[4],COLORREF col){
	int rpix = GetRValue(col),gpix = GetGValue(col),bpix = GetBValue(col);
	float tx1,ty1;
	float tx2,ty2;
	float tx3,ty3;
	float tx4,ty4;
	float tx5,ty5;
	float tx6,ty6;
	tx1 = (x[0]+x[1])/2;	ty1 = (y[0]+y[1])/2;
	tx2 = (x[2]+x[1])/2;	ty2 = (y[2]+y[1])/2;
	tx3 = (x[2]+x[3])/2;	ty3 = (y[2]+y[3])/2;
	tx4 = (tx1+tx2)/2;		ty4 = (ty1+ty2)/2;
	tx5 = (tx3+tx2)/2;		ty5 = (ty3+ty2)/2;
	tx6 = (tx4+tx5)/2;		ty6 = (ty4+ty5)/2;
	int xx = int(tx6+0.5f),yy = int(ty6+0.5f);
	if(End(x[0],y[0],x[3],y[3],tx6,ty6)){
		if(pdc.GetPixel(xx+1,yy)==col&&pdc.GetPixel(xx,yy+1)==col){
			return;
		}
		if(pdc.GetPixel(xx-1,yy)==col&&pdc.GetPixel(xx,yy+1)==col){
			return;
		}
		if(pdc.GetPixel(xx+1,yy)==col&&pdc.GetPixel(xx,yy-1)==col){
			return;
		}
		if(pdc.GetPixel(xx-1,yy)==col&&pdc.GetPixel(xx,yy-1)==col){
			return;
		}
		if(xx>=0&&xx<width&&yy>=0&&yy<=height){
			pdc.SetPixel(xx,yy,col);
			pix[0][xx][yy] = rpix;
			pix[1][xx][yy] = gpix;
			pix[2][xx][yy] = bpix;
		}
	}
	else{
		float tx[4],ty[4];
		if(xx>=0&&xx<width&&yy>=0&&yy<=height){
			pdc.SetPixel(xx,yy,col);
			pix[0][xx][yy] = rpix;
			pix[1][xx][yy] = gpix;
			pix[2][xx][yy] = bpix;
		}
		tx[0] = x[0];tx[1] = tx1;tx[2] = tx4;tx[3] = tx6;
		ty[0] = y[0];ty[1] = ty1;ty[2] = ty4;ty[3] = ty6;
		DrawBezier(tx,ty,col);
		tx[0] = tx6;tx[1] = tx5;tx[2] = tx3;tx[3] = x[3];
		ty[0] = ty6;ty[1] = ty5;ty[2] = ty3;ty[3] = y[3];
		DrawBezier(tx,ty,col);
	}
}
void CBmpDat::Bezier(int sx[],int sy[],int m){
	COLORREF col;
	if(m){
		col = bgcol;
	}
	else{
		col = pecol;
	}
	float x[4],y[4];
	for(int i = 0;i<4;i++){
		x[i] = (float)sx[i];
		y[i] = (float)sy[i];
	}
	DrawBezier(x,y,col);
}
void CBmpDat::ReBezier(int sx[],int sy[],int m){
	pdc.BitBlt(0,0,width,height,&bfdc,0,0,SRCCOPY);
	for(int i = 0;i<width;i++){
		for(int j = 0;j<height;j++){
			pix[0][i][j] = bfpix[0][i][j];
			pix[1][i][j] = bfpix[1][i][j];
			pix[2][i][j] = bfpix[2][i][j];
		}
	}
	Bezier(sx,sy,m);
}
//////////////////////////////////////////////////////////////////////////////
void CBmpDat::Line(int sx,int sy,int tx,int ty,int m){
	COLORREF col = pecol;
	if(m){
		col = bgcol;
	}
	if(tx>sx){
		if(ty>sy){
			if(ty-sy>tx-sx){
				Line(sy,sx,ty,tx,1,1,1,col);
			}
			else{
				Line(sx,sy,tx,ty,0,1,1,col);
			}
		}
		else{
			if(sy-ty>tx-sx){
				Line(-sy,sx,-ty,tx,1,-1,1,col);
			}
			else{
				Line(sx,-sy,tx,-ty,0,1,-1,col);
			}
		}
	}
	else{
		if(ty>sy){
			if(ty-sy>sx-tx){
				Line(sy,-sx,ty,-tx,1,1,-1,col);
			}
			else{
				Line(-sx,sy,-tx,ty,0,-1,1,col);
			}
		}
		else{
			if(sy-ty>sx-tx){
				Line(-sy,-sx,-ty,-tx,1,-1,-1,col);
			}
			else{
				Line(-sx,-sy,-tx,-ty,0,-1,-1,col);
			}
		}
	}
}

//////////////////////////中点画线算法////////////////////////////////
void CBmpDat::Line(int sx,int sy,int tx,int ty,int c,int dx,int dy,COLORREF col){
//	pdc->MoveTo(sx,sy);
//	pdc->LineTo(tx,ty);
	int tr,tg,tb;
	tr = GetRValue(col);
	tg = GetGValue(col);
	tb = GetBValue(col);
	int a,b,d1,d2,d,x,y;
	a = sy - ty;
	b = tx - sx;
	d = a+a+b;
	d1 = a+a;
	d2 = a+a+b+b;
	x = sx;
	y = sy;
	if(c){
		if(dy*y>=0&&dx*x>=0&&dx*x<height&&dy*y<width){
			pdc.SetPixel(dy*y,dx*x,col);
			pix[0][dy*y][dx*x] = tr;
			pix[1][dy*y][dx*x] = tg;
			pix[2][dy*y][dx*x] = tb;
		}
	}
	else{
		if(dy*y>=0&&dx*x>=0&&dx*x<width&&dy*y<height){
			pdc.SetPixel(dx*x,dy*y,col);
			pix[0][dx*x][dy*y] = tr;
			pix[1][dx*x][dy*y] = tg;
			pix[2][dx*x][dy*y] = tb;
		}
	}
	int ddd,ddd2;
	if(c){
		ddd2 = width;
		ddd = height;
	}
	else{
		ddd = width;
		ddd2 = height;
	}
	while(x<tx){
		if(d<0){
			x++;y++;
			d += d2;
		}
		else{
			x++;
			d += d1;
		}
		if(dx*x>=(ddd)||dy*y>=(ddd2)||dx*x<0||dy*y<0){
			break;
		}
		if(c){
			if(dy*y>=0&&dx*x>=0&&dx*x<ddd&&dy*y<ddd2){
				pdc.SetPixel(dy*y,dx*x,col);
				pix[0][dy*y][dx*x] = tr;
				pix[1][dy*y][dx*x] = tg;
				pix[2][dy*y][dx*x] = tb;
			}
		}
		else{
			if(dy*y>=0&&dx*x>=0&&dx*x<ddd&&dy*y<ddd2){
				pdc.SetPixel(dx*x,dy*y,col);
				pix[0][dx*x][dy*y] = tr;
				pix[1][dx*x][dy*y] = tg;
				pix[2][dx*x][dy*y] = tb;
			}
		}
	}
}

void CBmpDat::ReLine(int sx,int sy,int tx,int ty,int c,int m){
	pdc.BitBlt(0,0,width,height,&bfdc,0,0,SRCCOPY);
	if(c){
		for(int i = 0;i<width;i++){
			for(int j = 0;j<height;j++){
				pix[0][i][j] = bfpix[0][i][j];
				pix[1][i][j] = bfpix[1][i][j];
				pix[2][i][j] = bfpix[2][i][j];
			}
		}
	}
	Line(sx,sy,tx,ty,m);
}

void CBmpDat::Darw(int x,int y,int m){
	int tr,tg,tb;
	COLORREF col = pecol;
	if(m)
		col = bgcol;
	tr = GetRValue(col);
	tg = GetGValue(col);
	tb = GetBValue(col);
	pix[0][x][y] = tr;
	pix[1][x][y] = tg;
	pix[2][x][y] = tb;
	bfpix[0][x][y] = tr;
	bfpix[1][x][y] = tg;
	bfpix[2][x][y] = tb;
	pdc.SetPixel(x,y,col);
	bfdc.SetPixel(x,y,col);
}

/////////////////////////////////////////////////
void CBmpDat::Clear(int x,int y){
	int i,j;
	int bi,ei,bj,ej;
	BYTE tr,tg,tb;
	tr = GetRValue(bgcol);
	tg = GetGValue(bgcol);
	tb = GetBValue(bgcol);
	CPen pen1,*op1;
//	CPen pen2,*op2;
	pen1.CreatePen(PS_SOLID,1,bgcol);
	op1 = pdc.SelectObject(&pen1);
//	pen2.CreatePen(PS_SOLID,1,bgcol);
//	op2 = bfdc.SelectObject(&pen2);
	bi = x-5<0?0:x-5;
	ei = x+6>width?width:x+6;
	bj = y-5<0?0:y-5;
	ej = y+6>height?height:y+6;
	for(i = bi;i<ei;i++){
		for(j = bj;j<ej;j++){
			pix[0][i][j] = tr;
			pix[1][i][j] = tg;
			pix[2][i][j] = tb;
//			bfpix[0][i][j] = tr;
//			bfpix[1][i][j] = tg;
//			bfpix[2][i][j] = tb;
		}
		pdc.MoveTo(i,bj);
		pdc.LineTo(i,ej);
//		bfdc.MoveTo(i,bj);
//		bfdc.LineTo(i,ej);
	}
	pdc.SelectObject(op1);
//	pdc.SelectObject(op2);
}

////////////////////////////////////////////////////////////
void CBmpDat::CZ(int cn,int a[],int cr,int cg,int cb){
	int i,j;
	CString str;
	for(i = 0;i<width;i++){
		for(j = 0;j<height;j++){
			if(cr)
				pix[0][i][j] = XZ(0,i,j,cn,a);
			if(cg)
				pix[1][i][j] = XZ(1,i,j,cn,a);
			if(cb)
				pix[2][i][j] = XZ(2,i,j,cn,a);
			pdc.SetPixel(i,j,RGB(pix[0][i][j],pix[1][i][j],pix[2][i][j]));
		}
		str.Format("已完成%d%%",i*100/width);
		mmcsb->SetWindowText(str);
	}
	mmcsb->SetWindowText("就绪");
	BeiFen();
}
BYTE CBmpDat::XZ(int i,int x,int y,int cn,int a[]){
	switch(cn){
//	case 0:return BY(i,x,y);//边缘
//	case 1:return FD(i,x,y);//浮雕
	case 2:return LB(i,x,y,a[0]);//滤波
	case 3:return MH(i,x,y);//模糊
	case 4:return LA(i,x,y,a[0],1);//亮度增加
	case 5:return LA(i,x,y,a[0],0);//亮度减少
	}
	return 0;
}
///////////////////////////////////////////////////////
void CBmpDat::DBD(){
	int i,j;
	int maxr = 0,maxg = 0,maxb = 0;
	int minr = 255,ming = 255,minb = 255;
	int maxp = 0,minp = 255;
	CString str;
	for(i = 0;i<width;i++){
		for(j = 0;j<height;j++){
			if(pix[0][i][j]>maxr){
				maxr = pix[0][i][j];
			}
			if(pix[0][i][j]<minr){
				minr = pix[0][i][j];
			}
			if(pix[1][i][j]>maxg){
				maxg = pix[1][i][j];
			}
			if(pix[1][i][j]<ming){
				ming = pix[1][i][j];
			}
			if(pix[2][i][j]>maxb){
				maxb = pix[2][i][j];
			}
			if(pix[2][i][j]<minb){
				minb = pix[2][i][j];
			}//*/
		}
		str.Format("已完成%d%%",i*20/width);
		mmcsb->SetWindowText(str);
	}
	////////////
//	maxr = 125;
//	maxg = 125;
//	maxb = 125;
	////////////
	int dr = maxr - minr;
	int dg = maxg - ming;
	int db = maxb - minb;
	for(i = 0;i<width;i++){
		for(j = 0;j<height;j++){
			if(dr)pix[0][i][j] = ((int)pix[0][i][j] - minr)*255/dr;
			if(dg)pix[1][i][j] = ((int)pix[1][i][j] - ming)*255/dg;
			if(db)pix[2][i][j] = ((int)pix[2][i][j] - minb)*255/db;
			pdc.SetPixel(i,j,RGB(pix[0][i][j],pix[1][i][j],pix[2][i][j]));
		}
		str.Format("已完成%d%%",i*80/width+20);
		mmcsb->SetWindowText(str);
	}
	mmcsb->SetWindowText("就绪");
	BeiFen();
}
//////////////////////////
void CBmpDat::SMXG(int bl,int bw,int dx,int dy){
	bl++;
	int cou = 0;
	int tot = width*height;
	int i,j,k;
	int len = 0,ln;
	HDTX(0);
	srand(time(NULL));
	CString str;
	COLORREF tcl;
	if(dy){
		for(i = 0;i<width;i++){
			for(j = i,k = 0;j<width&&j>=0&&k<height&&k>=0;j+=dx,k+=dy){
				if(len == 0){
					len = rand()%bl+1;
					if(bw ==0){
						ln = 0;
					}
					else if(bw == 100){
						ln = 256;
					}
					else if(bw<11){
						ln = rand()%(bw*10);
					}
					else if(bw<95){
						ln = rand()%110+bw-10;
					}
					else{
						ln = rand()%100+(bw+14*(bw-95));
					}
				}
				tcl = SMXG(j,k,ln);
				pix[0][j][k] = GetRValue(tcl);
				pix[1][j][k] = GetGValue(tcl);
				pix[2][j][k] = GetBValue(tcl);
				pdc.SetPixel(j,k,tcl);
				len --;
				cou++;
			}
			str.Format("已完成%d%%",cou*100/tot);
			mmcsb->SetWindowText(str);
		}
	}
	if(dx){
		for(i = 1;i<height;i++){
			if(dx*dy==-1){
				j = width-1;
			}
			else{
				j = 0;
			}
			for(k = i;j<width&&j>=0&&k<height&&k>=0;j+=dx,k+=dy){
				if(len == 0){
					len = rand()%bl+1;
					if(bw ==0){
						ln = 0;
					}
					else if(bw == 100){
						ln = 256;
					}
					else if(bw<11){
						ln = rand()%(bw*10);
					}
					else if(bw<95){
						ln = rand()%110+bw-10;
					}
					else{
						ln = rand()%100+(bw+14*(bw-95));
					}
				}
				tcl = SMXG(j,k,ln);
				pix[0][j][k] = GetRValue(tcl);
				pix[1][j][k] = GetGValue(tcl);
				pix[2][j][k] = GetBValue(tcl);
				pdc.SetPixel(j,k,tcl);
				len --;
				cou++;
			}
			str.Format("已完成%d%%",cou*100/tot);
			mmcsb->SetWindowText(str);
		}
	}
	mmcsb->SetWindowText("就绪");
	BeiFen();
}
COLORREF CBmpDat::SMXG(int x,int y,int ln){
	int t = bfpix[0][x][y],n = 1;
	if(x>0){
		if(y>0){
			t += bfpix[0][x-1][y-1];
			n++;
		}
		if(y<height-1){
			t += bfpix[0][x-1][y+1];
			n++;
		}
		t += bfpix[0][x-1][y];
		n++;
	}
	if(x<width-1){
		if(y>0){
			t += bfpix[0][x+1][y-1];
			n++;
		}
		if(y<height-1){
			t += bfpix[0][x+1][y+1];
			n++;
		}
		t += bfpix[0][x+1][y-1];
		n++;
	}
	return (t/n)>=(ln)?bgcol:pecol;
}
//////////////////灰度图像
void CBmpDat::HDTX(int s){
	int i,j;
	int temp;
	CString str;
	for(i = 0;i<width;i++){
		for(j = 0;j<height;j++){
			temp = (30*int(pix[0][i][j]) + 59*int(pix[1][i][j]) + 11*int(pix[2][i][j]))/100;
			pix[0][i][j] = temp;
			pix[1][i][j] = temp;
			pix[2][i][j] = temp;
			bfpix[0][i][j] = temp;
			bfpix[1][i][j] = temp;
			bfpix[2][i][j] = temp;
			if(s){
				pdc.SetPixel(i,j,RGB(pix[0][i][j],pix[1][i][j],pix[2][i][j]));
			}
		}
		if(s){
			str.Format("已完成%d%%",i*100/width);
			mmcsb->SetWindowText(str);
		}
	}
	if(s){

		mmcsb->SetWindowText("就绪");
		BeiFen();
	}
}
//////////////////缩放///////////////////////////
void CBmpDat::Zoom(int w,int h){
	BeiFen();
	int i,j,oi;
	float temp;
	int f1,f2;
	CString str;
	////////////////////////////////////
	//宽度进行缩放
	for(j = 0;j<height;j++){
		bfpix[0][w-1][j] = pix[0][width-1][j];
		bfpix[1][w-1][j] = pix[1][width-1][j];
		bfpix[2][w-1][j] = pix[2][width-1][j];
//		pix[0][w-1][j] = bfpix[0][width-1][j];
//		pix[1][w-1][j] = bfpix[1][width-1][j];
//		pix[2][w-1][j] = bfpix[2][width-1][j];
//		pdc.SetPixel(w-1,j,RGB(pix[0][w-1][j],pix[1][w-1][j],pix[2][w-1][j]));
	}
	for(i = 0;i<w-1;i++){
		temp = float(i * (width-1)) / float(w-1);
		temp += 0.00001f;//结果校正
		oi = int(temp);
		f2 = int(temp*100) - oi*100;
		f1 = 100 - f2;
		for(j = 0;j<height;j++){
			bfpix[0][i][j] = (pix[0][oi][j]*f1 + pix[0][oi+1][j]*f2)/100;
			bfpix[1][i][j] = (pix[1][oi][j]*f1 + pix[1][oi+1][j]*f2)/100;
			bfpix[2][i][j] = (pix[2][oi][j]*f1 + pix[2][oi+1][j]*f2)/100;
//			pix[0][i][j] = (bfpix[0][oi][j]*f1 + bfpix[0][oi+1][j]*f2)/100;
//			pix[1][i][j] = (bfpix[1][oi][j]*f1 + bfpix[1][oi+1][j]*f2)/100;
//			pix[2][i][j] = (bfpix[2][oi][j]*f1 + bfpix[2][oi+1][j]*f2)/100;
//			pdc.SetPixel(i,j,RGB(pix[0][i][j],pix[1][i][j],pix[2][i][j]));
		}
	}
	////////////////////////////////////*/
	//高度进行缩放
	for(i = 0;i<w;i++){
		pix[0][i][h-1] = bfpix[0][i][height-1];
		pix[1][i][h-1] = bfpix[1][i][height-1];
		pix[2][i][h-1] = bfpix[2][i][height-1];
		pdc.SetPixel(i,h-1,RGB(pix[0][i][h-1],pix[1][i][h-1],pix[2][i][h-1]));
	}
	for(j = 0;j<h-1;j++){
		temp = float(j * (height-1)) / float(h-1);
		temp += 0.00001f;//结果校正
		oi = int(temp);
		f2 = int(temp*100) - oi*100;
		f1 = 100 - f2;
		for(i = 0;i<w;i++){
			pix[0][i][j] = (bfpix[0][i][oi]*f1 + bfpix[0][i][oi+1]*f2)/100;
			pix[1][i][j] = (bfpix[1][i][oi]*f1 + bfpix[1][i][oi+1]*f2)/100;
			pix[2][i][j] = (bfpix[2][i][oi]*f1 + bfpix[2][i][oi+1]*f2)/100;
			pdc.SetPixel(i,j,RGB(pix[0][i][j],pix[1][i][j],pix[2][i][j]));
		}
		str.Format("已完成%d%%",j*100/h);
		mmcsb->SetWindowText(str);
	}//*/
	for(i = 0;i<w;i++){
		for(j = 0;j<h;j++){
			bfpix[0][i][j] = pix[0][i][j];
			bfpix[1][i][j] = pix[1][i][j];
			bfpix[2][i][j] = pix[2][i][j];
		}
	}
	bfdc.BitBlt(0,0,w,h,&pdc,0,0,SRCCOPY);
	oldwidth = width;
	width = w;
	oldheight = height;
	height = h;
	mmcsb->SetWindowText("就绪");
}
///////////////////平移/////////////////////
void CBmpDat::Move(int dx,int dy){
	int i,j;
	int tx,ty;
	CPen pen,*op;
	pen.CreatePen(PS_SOLID,796,RGB(255,255,255));
	//////////////////////////////////////使用白色画笔
	op = pdc.SelectObject(&pen);
	//////////////////////////////////////
	pdc.MoveTo(0,393);
	pdc.LineTo(1024,393);
	////////////////////////////////////////
	pdc.SelectObject(op);

	for(i = 0;i<width;i++){
		for(j = 0;j<height;j++){
			tx = i - dx;
			ty = j - dy;
			if(tx>=width||tx<0||ty>=height||ty<0){
				pix[0][i][j] = 255;
				pix[1][i][j] = 255;
				pix[2][i][j] = 255;
			}
			else{
				pix[0][i][j] = bfpix[0][tx][ty];
				pix[1][i][j] = bfpix[1][tx][ty];
				pix[2][i][j] = bfpix[2][tx][ty];
			}
		}
	}
	pdc.BitBlt(dx,dy,width,height,&bfdc,0,0,SRCCOPY);
	BeiFen();
}
/////////////////////////////////
double Max(double n[]){
	double n1,n2;
	n1 = n[0]>n[1]?n[0]:n[1];
	n2 = n[2]>n[3]?n[2]:n[3];
	return n1>n2?n1:n2;
}
double Min(double n[]){
	double n1,n2;
	n1 = n[0]<n[1]?n[0]:n[1];
	n2 = n[2]<n[3]?n[2]:n[3];
	return n1<n2?n1:n2;
}
///////////////旋转//////////////
void CBmpDat::Turn(int de){
	BeiFen();
	double pdec = double(de) * 3.1415926 / 180.0;
	double sind = sin(pdec);
	double cosd = cos(pdec);
	double nx[4] = {0,0,0,0};
	double ny[4] = {0,0,0,0};
	nx[1] = width*cosd - height*sind;
	ny[1] = width*sind + height*cosd;
	nx[2] = -height*sind;
	ny[2] = height*cosd;
	nx[3] = width*cosd;
	ny[3] = width*sind;
	double maxy,miny,maxx,minx;
	maxy = Max(ny);
	maxx = Max(nx);
	miny = Min(ny);
	minx = Min(nx);
	int dx = int(maxx - minx + 0.5);	//新的宽度
	int dy = int(maxy - miny + 0.5);	//新的高度
	int mx = int(minx - 0.5);		//转换后应偏移的横坐标
	int my = int(miny - 0.5);		//转换后应偏移的纵坐标
	sind = -sind;

	int i,j;
	int fx1,fx2,fy1,fy2;
	int tx,ty,tp1[3],tp2[3],tp3[3],tp4[3];
	for(i = 0;i<dx;i++){
		for(j = 0;j<dy;j++){
			minx = (i + mx)*cosd - (j + my)*sind + 0.00001;
			miny = (i + mx)*sind + (j + my)*cosd + 0.00001;
			fx1 = int(minx);
			fy1 = int(miny);
			if(minx<0)
				fx1 --;
			if(miny<0)
				fy1--;
			fx2 = fx1 + 1;
			fy2 = fy1 + 1;
			tx = int(minx*100)-int(minx)*100;
			if(tx<0)
				tx = 100+tx;
			ty = int(miny*100)-int(miny)*100;
			if(ty<0)
				ty = 100+ty;

				if(fx1>=0&&fx1<width){
					if(fy1>=0&&fy1<height){
						tp1[0] = bfpix[0][fx1][fy1];
						tp1[1] = bfpix[1][fx1][fy1];
						tp1[2] = bfpix[2][fx1][fy1];
					}
					else{
						tp1[0] = 255;
						tp1[1] = 255;
						tp1[2] = 255;
					}
					if(fy2<height&&fy2>=0){
						tp2[0] = bfpix[0][fx1][fy2];
						tp2[1] = bfpix[1][fx1][fy2];
						tp2[2] = bfpix[2][fx1][fy2];
					}
					else{
						tp2[0] = 255;
						tp2[1] = 255;
						tp2[2] = 255;
					}
				}
				else{
					tp1[0] = 255;
					tp1[1] = 255;
					tp1[2] = 255;
					tp2[0] = 255;
					tp2[1] = 255;
					tp2[2] = 255;
				}
				if(fx2>=0&&fx2<width){
					if(fy1>=0&&fy1<height){
						tp3[0] = bfpix[0][fx2][fy1];
						tp3[1] = bfpix[1][fx2][fy1];
						tp3[2] = bfpix[2][fx2][fy1];
					}
					else {
						tp3[0] = 255;
						tp3[1] = 255;
						tp3[2] = 255;
					}
					if(fy2>=0&&fy2<height){
						tp4[0] = bfpix[0][fx2][fy2];
						tp4[1] = bfpix[1][fx2][fy2];
						tp4[2] = bfpix[2][fx2][fy2];
					}
					else{
						tp4[0] = 255;
						tp4[1] = 255;
						tp4[2] = 255;
					}
				}
				else{
					tp3[0] = 255;
					tp3[1] = 255;
					tp3[2] = 255;
					tp4[0] = 255;
					tp4[1] = 255;
					tp4[2] = 255;
				}
				pix[0][i][j] = ((100-ty)*(((100-tx)*tp1[0]+tx*tp3[0])/100)+ty*(((100-tx)*tp2[0]+tx*tp4[0])/100))/100;
				pix[1][i][j] = ((100-ty)*(((100-tx)*tp1[1]+tx*tp3[1])/100)+ty*(((100-tx)*tp2[1]+tx*tp4[1])/100))/100;
				pix[2][i][j] = ((100-ty)*(((100-tx)*tp1[2]+tx*tp3[2])/100)+ty*(((100-tx)*tp2[2]+tx*tp4[2])/100))/100;
				pdc.SetPixel(i,j,RGB(pix[0][i][j],pix[1][i][j],pix[2][i][j]));

		}
	}
	for(i = 0;i<dx;i++){
		for(j = 0;j<dy;j++){
			bfpix[0][i][j] = pix[0][i][j];
			bfpix[1][i][j] = pix[1][i][j];
			bfpix[2][i][j] = pix[2][i][j];
		}
	}
	bfdc.BitBlt(0,0,dx,dy,&pdc,0,0,SRCCOPY);
	width = dx;
	height = dy;
}

/////////////////////////////////////////////
void CBmpDat::RH(){
	int i,j;
	CString str;
	for(i = 0;i<width;i++){
		for(j = 0;j<height;j++){
			pix[0][i][j] = RH(0,i,j);
			pix[1][i][j] = RH(1,i,j);
			pix[2][i][j] = RH(2,i,j);
			pdc.SetPixel(i,j,RGB(pix[0][i][j],pix[1][i][j],pix[2][i][j]));
		}
		str.Format("已完成%d%%",i*100/width);
		mmcsb->SetWindowText(str);
	}
	mmcsb->SetWindowText("就绪");
	BeiFen();
}
BYTE CBmpDat::RH(int i,int x,int y){
	int temp = 0;
	int count = 1;
	if(x>0){
		temp += int(bfpix[i][x-1][y]);
		count ++;
		if(y>0){
			temp += int(bfpix[i][x-1][y-1]);
			count ++;
		}
		if(y<height-1){
			temp += int(bfpix[i][x-1][y+1]);
			count ++;
		}
	}
	if(y>0){
		temp += int(bfpix[i][x][y-1]);
		count ++;
	}
	if(y<height-1){
		temp += int(bfpix[i][x][y+1]);
		count ++;
	}
	if(x<width){
		temp += int(bfpix[i][x+1][y]);
		count ++;
		if(y>0){
			temp += int(bfpix[i][x+1][y-1]);
			count ++;
		}
		if(y<height-1){
			temp += int(bfpix[i][x+1][y+1]);
			count ++;
		}
	}
	temp = ((count+3) * int(bfpix[i][x][y]) - temp)/4;
	return temp;
}
//////////////////////////////////////////////////////////
void CBmpDat::NOT(){
	int i,j;
	CString str;
	for(i = 0;i<width;i++){
		for(j = 0;j<height;j++){
			pix[0][i][j] = 255-pix[0][i][j];
			pix[1][i][j] = 255-pix[1][i][j];
			pix[2][i][j] = 255-pix[2][i][j];
			pdc.SetPixel(i,j,RGB(pix[0][i][j],pix[1][i][j],pix[2][i][j]));
		}
		str.Format("已完成%d%%",i*100/width);
		mmcsb->SetWindowText(str);
	}
	mmcsb->SetWindowText("就绪");
	BeiFen();
}
/////////////////////////////////////////////////////////

void CBmpDat::Copy(){
	int i,j;
	COLORREF clr;
	for(i = 0;i<width;i++){
		for(j = 0;j<height;j++){
			clr = pdc.GetPixel(i,j);
			pix[0][i][j] = GetRValue(clr);
			pix[1][i][j] = GetGValue(clr);
			pix[2][i][j] = GetBValue(clr);
		}
	}
}

////////////////////////////
void CBmpDat::TextTemp(int x,int y,CString s[],int n,int dy){
	pdc.BitBlt(0,0,width,height,&bfdc,0,0,SRCCOPY);
	for(int i = 0;i<n;i++){
		pdc.TextOut(x,y+i*dy,s[i]);
	}
}
void CBmpDat::TextOK(int x,int y,CString s[],int n,int dx[],int dy){
	pdc.BitBlt(0,0,width,height,&bfdc,0,0,SRCCOPY);
	int j,k;
	COLORREF col;
	mmcsb->SetWindowText("文字提交中,请等待...");
	for(int i = 0;i<n;i++){
		pdc.TextOut(x,y+i*dy,s[i]);
		dx[i] += x;
		for(j = x<0?0:x;j<width||j<dx[i];j++){
			for(k = y<0?0:y;k<height||k<y+i*dy;k++){
				col = pdc.GetPixel(j,k);
				pix[0][j][k] = GetRValue(col);
				pix[1][j][k] = GetGValue(col);
				pix[2][j][k] = GetBValue(col);
			}
		}
	}
	mmcsb->SetWindowText("就绪");
	BeiFen();
}

void CBmpDat::SetFont(LOGFONT & lpc){
	CFont * cf,*ocf;
	cf = new CFont;
	cf->CreateFontIndirect(&lpc);
	ocf = pdc.SelectObject(cf);
	ocf->DeleteObject();
}
void CBmpDat::GetFont(LOGFONT &lpc){
	pdc.GetCurrentFont()->GetLogFont(&lpc);
}
///////////////////////////
void CBmpDat::Size(int w,int h){
	BeiFen();
	int minw,maxw;
	int minh,maxh;
	if(w>width){
		maxw = w;
		minw = width;
	}
	else{
		maxw = width;
		minw = w;
	}
	if(h>height){
		maxh = h;
		minh = height;
	}
	else{
		minh = h;
		maxh = height;
	}
	int i,j;
	for(i = minw;i<maxw;i++){
		for(j = 0;j<minh;j++){
			pix[0][i][j] = 255;
			pix[1][i][j] = 255;
			pix[2][i][j] = 255;
			bfpix[0][i][j] = 255;
			bfpix[1][i][j] = 255;
			bfpix[2][i][j] = 255;
		}
	}
	for(j = minh;j<maxh;j++){
		for(i = 0;i<maxw;i++){
			pix[0][i][j] = 255;
			pix[1][i][j] = 255;
			pix[2][i][j] = 255;
			bfpix[0][i][j] = 255;
			bfpix[1][i][j] = 255;
			bfpix[2][i][j] = 255;
		}
	}
	CDC mdc;
	mdc.CreateCompatibleDC(&pdc);
	CBitmap tb,*ob;
	tb.LoadBitmap(IDB_BBB);
	ob = mdc.SelectObject(&tb);
	pdc.BitBlt(minw,0,maxw-minw+1,maxh,&mdc,0,0,SRCCOPY);
	pdc.BitBlt(0,minh,maxw,maxh-minh+1,&mdc,0,0,SRCCOPY);
	bfdc.BitBlt(minw,0,maxw-minw+1,maxh,&mdc,0,0,SRCCOPY);
	bfdc.BitBlt(0,minh,maxw,maxh-minh+1,&mdc,0,0,SRCCOPY);
	mdc.SelectObject(ob);
	width = w;
	height = h;
}
///////////////////////////
void CBmpDat::TEST(int n){
	int i,j;
	COLORREF clr;
	CString str;
	HDTX(0);
	int x;int y;
	for(i = 0;i<width;i++){
		for(j = 0;j<height;j++){
			x = i/n*n,y = j/n*n;
			clr = (bfpix[0][x][y]>255-((i%n)*(i%n)+(j%n)*(j%n)+1)*245/((n-1)*(n-1)+1)+5)?bgcol:pecol;
			pdc.SetPixel(i,j,clr);
			pix[0][i][j] = GetRValue(clr);
			pix[1][i][j] = GetGValue(clr);
			pix[2][i][j] = GetBValue(clr);
		}
		str.Format("已完成%d%%",i*100/width);
		mmcsb->SetWindowText(str);
	}
	mmcsb->SetWindowText("就绪");
	BeiFen();
}