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

📄 dib.cpp

📁 自己用VC6.0编写的用遗传算法进行图像分割的软件
💻 CPP
📖 第 1 页 / 共 4 页
字号:
							   x+i, y+j+nDeta);
				j += nDeta;
				if (j > GetHeight())
				{
					j = GetHeight();
					bQuitLoop = TRUE;
				}
				pDC->BitBlt(x,  			//x dest
							y+j,		//y dest
				  			GetWidth()-i,		//width
							nDeta,	//depth
							&MemDC,
							i,			//y source
							j,				//x source
							SRCCOPY);
				pDC->Rectangle( x+GetWidth()-i,
								y+j,
								x+GetWidth(),
								y+j+nDeta);
				j += nDeta;
			}
			i++;
			break;
		}
		case EFFECT_HBLIND:
		{
			if (i > nDeta)
			{
				i = nDeta;
				bDone = TRUE;
			}
			for (LONG j=i; j<GetHeight(); j+=nDeta)
				pDC->Rectangle( x,
								y+j,
								x+GetWidth(),
								y+j+1);
			i++;
			break;
		}
		case EFFECT_VBLIND:
			if (i > nDeta)
			{
				i = nDeta;
				bDone = TRUE;
			}
			for (LONG j=i; j<GetWidth(); j+=nDeta)
				pDC->Rectangle( x+j,
								y,
								x+j+1,
								y+GetHeight());
			i++;
			break;
		}	// end of switch
//		Delay(dwDelayTime);
	}	// end of while

	MemDC.SelectObject(pOldBmp);
	pDC->SelectPalette(pOldPal, TRUE);

	return TRUE;
}

HDIB CDib::CopyRect(CRect rc)
{
	return CropDIB(m_hDib, rc);
}

BOOL CDib::CutRect(CRect rc)
{
	HDIB hNewDib = CutDIB(m_hDib, rc);
	if (! hNewDib)
		return FALSE;

	// set to m_hDib
	Destroy();
	m_hDib = hNewDib;

	// return
	return UpdateInternal();
}

BOOL CDib::MergeDib(HDIB hDib, CPoint ptTopLeft)
{
	POINT pt;
	pt.x = ptTopLeft.x;
	pt.y = ptTopLeft.y;
	HDIB hNewDib = MergeDIB(m_hDib, hDib, pt);
	if (! hNewDib)
		return FALSE;

	// set to m_hDib
	Destroy();
	m_hDib = hNewDib;

	// return
	return UpdateInternal();
}

BOOL CDib::TransparentMergeDib(HDIB hDib, CPoint ptTopLeft, COLORREF crTransparent)
{
	POINT pt;
	pt.x = ptTopLeft.x;
	pt.y = ptTopLeft.y;
	HDIB hNewDib = TransparentMergeDIB(m_hDib, hDib, pt, crTransparent);
	if (! hNewDib)
		return FALSE;

	// set to m_hDib
	Destroy();
	m_hDib = hNewDib;

	// return
	return UpdateInternal();
}

BOOL CDib::	Crop(CRect rc)
{
	HDIB hNewDib = CropDIB(m_hDib, rc);
	if (! hNewDib)
		return FALSE;

	// set to m_hDib
	Destroy();
	m_hDib = hNewDib;

	// return
	return UpdateInternal();
}

BOOL CDib::Rotate(double fDegrees, COLORREF clrBack)
{
	HDIB hNewDib = RotateDIB(m_hDib, fDegrees, clrBack);
	if (! hNewDib)
		return FALSE;

	// set to m_hDib
	Destroy();
	m_hDib = hNewDib;

	// return
	return UpdateInternal();
}

BOOL CDib::Rotate90()
{
	HDIB hNewDib = RotateDIB(m_hDib);
	if (! hNewDib)
		return FALSE;

	// set to m_hDib
	Destroy();
	m_hDib = hNewDib;

	// return
	return UpdateInternal();
}

BOOL CDib::Rotate180()
{
	HDIB h = RotateDIB(m_hDib);
	if (! h)
		return FALSE;
	HDIB hNewDib = RotateDIB(h);
	DestroyDIB(h);
	if (! hNewDib)
		return FALSE;

	// set to m_hDib
	Destroy();
	m_hDib = hNewDib;

	// return
	return UpdateInternal();
}

BOOL CDib::Rotate270()
{
	HDIB h1 = RotateDIB(m_hDib);
	if (! h1)
		return FALSE;
	HDIB h2 = RotateDIB(h1);
	DestroyDIB(h1);
	if (! h2)
		return FALSE;
	HDIB hNewDib = RotateDIB(h2);
	DestroyDIB(h2);
	if (! hNewDib)
		return FALSE;

	// set to m_hDib
	Destroy();
	m_hDib = hNewDib;

	// return
	return UpdateInternal();
}

BOOL CDib::FlipHorz()
{
	HDIB hNewDib = FlipHorzDIB(m_hDib);
	if (! hNewDib)
		return FALSE;

	// set to m_hDib
	Destroy();
	m_hDib = hNewDib;

	// return
	return UpdateInternal();
}

BOOL CDib::FlipVert()
{
	HDIB hNewDib = FlipVertDIB(m_hDib);
	if (! hNewDib)
		return FALSE;

	// set to m_hDib
	Destroy();
	m_hDib = hNewDib;

	// return
	return UpdateInternal();
}

BOOL CDib::	ChangeImageSize(int nWidth, int nHeight)
{
	HDIB hNewDib = ChangeDIBSize(m_hDib, nWidth, nHeight);
	if (! hNewDib)
		return FALSE;

	// set to m_hDib
	Destroy();
	m_hDib = hNewDib;

	// return
	return UpdateInternal();
}

BOOL CDib::Zoom(double fRatioX, double fRatioY)
{
	int nWidth = (int)(fRatioX * (double)GetWidth());
	int nHeight = (int)(fRatioY * (double)GetHeight());

	HDIB hNewDib = ChangeDIBSize(m_hDib, nWidth, nHeight);
	if (! hNewDib)
		return FALSE;

	// set to m_hDib
	Destroy();
	m_hDib = hNewDib;

	// return
	return UpdateInternal();
}

BOOL CDib::	ChangeCanvasSize(int nWidth, int nHeight, int nPosition)
{
	HDIB hNewDib = ChangeDIBCanvasSize(m_hDib, nWidth, nHeight, nPosition);
	if (! hNewDib)
		return FALSE;

	// set to m_hDib
	Destroy();
	m_hDib = hNewDib;

	// return
	return UpdateInternal();
}

BOOL CDib::IsRequireDither(CDC* pDC)
{
	// if device can not display DIB color, dithering DIB
	if (GetBitCount() > 8 && 
		pDC->GetDeviceCaps(BITSPIXEL) <= 8)
		return TRUE;

	return FALSE;
}

BOOL CDib::DitherDisplay(CDC* pDC, CRect rcDest, CRect rcSrc, DWORD dwRop)
{
	return DitherDisplayDIB(pDC->GetSafeHdc(), 
							rcDest, 
							m_hDib, 
							rcSrc, 
							dwRop);
}

BOOL CDib::AdjustColor(int nColorModel, int v1, int v2, int v3)
{
	if (! AdjustDIBColor(m_hDib, nColorModel, v1, v2, v3))
		return FALSE;

	return UpdateInternal();
}

BOOL CDib::AdjustBrightness(int v)
{
	if (! AdjustDIBBrightness(m_hDib, v))
		return FALSE;

	return UpdateInternal();
}

BOOL CDib::AdjustContrast(int v)
{
	if (! AdjustDIBContrast(m_hDib, v))
		return FALSE;

	return UpdateInternal();
}

BOOL CDib::SeparateRGB(int nIndex)
{
	HDIB hNewDib = SeparateRGBfromDIB(m_hDib, nIndex);
	if (! hNewDib)
		return FALSE;

	// set to m_hDib
	Destroy();
	m_hDib = hNewDib;

	// return
	return UpdateInternal();
}

BOOL CDib::FilteRGB(int nIndex)
{
	HDIB hNewDib = FilteRGBfromDIB(m_hDib, nIndex);
	if (! hNewDib)
		return FALSE;

	// set to m_hDib
	Destroy();
	m_hDib = hNewDib;

	// return
	return UpdateInternal();
}

BOOL CDib::ColorQuantize(int nColorBits)
{
	HDIB hNewDib;

	if (nColorBits > 8)
		hNewDib = ConvertDIBFormat(m_hDib, nColorBits, NULL); 
	else
	{
		int nColors = 1<<nColorBits;
		hNewDib = ColorQuantizeDIB(m_hDib, nColorBits, nColors);
	}

	if (! hNewDib)
		return FALSE;

	Destroy();
	m_hDib = hNewDib;
	
	return UpdateInternal();
}

BOOL CDib::ChangeToGrayscale(int nMethod, double fRedWeight, double fGreenWeight, double fBlueWeight)
{
	HPALETTE hPal = ConvertToGrayscale(m_hDib, nMethod, fRedWeight, fGreenWeight, fBlueWeight);
	if (hPal == NULL)
		return FALSE;

	// set new palette
	if (m_pPalette != NULL)
		delete m_pPalette;

	m_pPalette = new CPalette;
	m_pPalette->Attach(hPal);

	// rebuild bitmap
	return UpdateInternal();
}

BOOL CDib::HighPass(int Strength, int nAlgorithm)
{
	if (IsEmpty())
		return FALSE;

	if (! HighPassDIB(m_hDib, Strength, nAlgorithm))
		return FALSE;

	// return
	return UpdateInternal();
}

BOOL CDib::LowPass(int Strength, int nAlgorithm)
{
	if (IsEmpty())
		return FALSE;

	if (! LowPassDIB(m_hDib, Strength, nAlgorithm))
		return FALSE;

	// return
	return UpdateInternal();
}

BOOL CDib::EdgeEnhance(int Strength, int nAlgorithm)
{
	if (IsEmpty())
		return FALSE;

	if (! EdgeEnhanceDIB(m_hDib, Strength, nAlgorithm))
		return FALSE;

	// return
	return UpdateInternal();
}

BOOL CDib::MedianFilter()
{
	if (IsEmpty())
		return FALSE;

	if (! MedianFilterDIB(m_hDib))
		return FALSE;

	// return
	return UpdateInternal();
}

BOOL CDib::ConvertFormat(WORD wBitCount)
{
	if (IsEmpty())
		return FALSE;

	if (GetBitCount() == wBitCount)
		return TRUE;

	HDIB hNewDib = ConvertDIBFormat(m_hDib, wBitCount, NULL); 
	if (! hNewDib)
		return FALSE;

	Destroy();
	m_hDib = hNewDib;
	return UpdateInternal();
}

BOOL CDib::Erosion(BOOL bHoriz)
{
	if (IsEmpty())
		return FALSE;

	if (! ErosionDIB(m_hDib, bHoriz))
		return FALSE;

	// return
	return UpdateInternal();
}

BOOL CDib::Dilation(BOOL bHoriz)
{
	if (IsEmpty())
		return FALSE;

	if (! DilationDIB(m_hDib, bHoriz))
		return FALSE;

	// return
	return UpdateInternal();
}

BOOL CDib::MorphOpen(BOOL bHoriz)
{
	if (IsEmpty())
		return FALSE;

	if (! MorphOpenDIB(m_hDib, bHoriz))
		return FALSE;

	// return
	return UpdateInternal();
}

BOOL CDib::MorphClose(BOOL bHoriz)
{
	if (IsEmpty())
		return FALSE;

	if (! MorphCloseDIB(m_hDib, bHoriz))
		return FALSE;

	// return
	return UpdateInternal();
}

BOOL CDib::Contour(BOOL bHoriz)
{
	if (IsEmpty())
		return FALSE;

	if (! ContourDIB(m_hDib, bHoriz))
		return FALSE;

	// return
	return UpdateInternal();
}

BOOL CDib::Thinning()
{
	if (IsEmpty())
		return FALSE;

	if (! ThinningDIB(m_hDib))
		return FALSE;

	// return
	return UpdateInternal();
}

BOOL CDib::Reverse()
{
	if (IsEmpty())
		return FALSE;

	if (! ReverseDIB(m_hDib))
		return FALSE;

	// return
	return UpdateInternal();
}

BOOL CDib::FFT()
{
	if (IsEmpty())
		return FALSE;

	if (! FFTDIB(m_hDib))
		return FALSE;

	// return
	return UpdateInternal();
}

BOOL CDib::DCT()
{
	if (IsEmpty())
		return FALSE;

	if (! DCTDIB(m_hDib))
		return FALSE;

	// return
	return UpdateInternal();
}

BOOL CDib::WALh()
{
	if (IsEmpty())
		return FALSE;

	if (! WALhDIB(m_hDib))
		return FALSE;

	// return
	return UpdateInternal();
}

BOOL CDib::Convert2BW(int threshold)
{
	//WaitCursorBegin();
	WaitCursorBegin();
	HDIB m_hDIBhere=m_hDib;
	WORD wBitCount=DIBBitCount(m_hDIBhere);
	if(wBitCount!=8)
	{
		WaitCursorEnd();
		return FALSE;
	}
	LPBITMAPINFO lpSrcDIB=(LPBITMAPINFO)GlobalLock(m_hDIBhere);
	if(lpSrcDIB==NULL)
	{
		WaitCursorEnd();
		return FALSE;
	}
	LPSTR lpPtr;
	LONG height=DIBHeight(lpSrcDIB);
	LONG width=DIBWidth(lpSrcDIB);
	DWORD buffersizeinfo=GlobalSize(lpSrcDIB);
	int bytesperline=BytesPerLine(lpSrcDIB);
	for(int i=0;i<height;i++)
		for(int j=0;j<width;j++)
		{
			lpPtr=(LPSTR)lpSrcDIB+(buffersizeinfo-bytesperline-i*bytesperline)+j;
			if(*lpPtr>=threshold)
				*lpPtr=char(255);
			else
				*lpPtr=char(0);
		}
	GlobalUnlock(m_hDIBhere);
	return TRUE;
}

int CDib::GetThreshold(double T0)
{
	//T0是设定的参数
	WaitCursorBegin();
	HDIB m_hDIBhere=m_hDib;
//	HDIB m_hDIBhere=NULL;
//	m_hDIBhere=CopyHandle(m_hDib);
//	m_hDIBhere=m_hDib;
	if(!m_hDIBhere)
		AfxMessageBox("copy handle is not survived");
	WORD wBitCount=DIBBitCount(m_hDIBhere);
	if(wBitCount!=8)
	{
		WaitCursorEnd();
		return FALSE;
	}
	LPBITMAPINFO lpSrcDIB=(LPBITMAPINFO)GlobalLock(m_hDIBhere);
//	LPBYTE lpDIB=(LPBYTE)GlobalLock(m_hDIBhere);
//	LPBYTE lpDIBbits=FindDIBBits(lpDIB);
	if(lpSrcDIB==NULL)
	{
		WaitCursorEnd();
		return FALSE;
	}
	LPSTR lpPtr;
	LONG height=DIBHeight(lpSrcDIB);
	LONG width=DIBWidth(lpSrcDIB);

	TRACE("height = %d, width = %d, lpSrcDib = %d\n", height, width, lpSrcDIB);
	
	DWORD buffersize=GlobalSize(lpSrcDIB);//这里出错了
	
//	LPSTR lpbits=FindDIBBits(lpSrcDIB);
	int bytesperline=BytesPerLine(lpSrcDIB);
	//算法
	double T00=128;
	double T1,T2;
	T1=T2=128;
//	int n=0;
	//下面是算法
	while(T00>T0)
	{
		double G1,G2,U1,U2;
		G1=G2=U1=U2=0;
		int num1,num2;
		num1=num2=0;
		for(int i=0;i<height;i++)
			for(int j=0;j<width;j++)
			{
				lpPtr=(LPSTR)lpSrcDIB+buffersize-(i+1)*bytesperline+j;
				if(*lpPtr>=T1)
				{
					num2++;
					G2+=*lpPtr;
				}
				else
				{
					num1++;
					G1+=*lpPtr;
				}
			}
		U1=num1 ? G1/num1 : 0;
		U2=num2 ? G2/num2 : 0;
		
		T2=T1;
		T1=(U1+U2)/2;
//		T00=abs(T1-T2);
		T00=T1-T2;
		T00=(T00-0>=0)?T00:-T00;
//		AfxMessageBox("there no circle");
	}
	GlobalUnlock(m_hDIBhere);
	return int(T1);
}

BOOL CDib::Edge()
{
	WaitCursorBegin();
	HDIB m_hDIBhere=m_hDib;
	WORD wBitCount=DIBBitCount(m_hDIBhere);
	if(wBitCount!=8)
	{
		WaitCursorEnd();
		return FALSE;
	}
	LPBITMAPINFO lpSrcDIB=(LPBITMAPINFO)GlobalLock(m_hDIBhere);
	if(lpSrcDIB==NULL)
	{
		WaitCursorEnd();
		return FALSE;
	}
	LPSTR lpPtr;
	LONG height=DIBHeight(lpSrcDIB);
	LONG width=DIBWidth(lpSrcDIB);
	DWORD buffersizeinfo=GlobalSize(lpSrcDIB);
	int bytesperline=BytesPerLine(lpSrcDIB);
	for(int i=1;i<height-1;i++)
		for(int j=1;j<width-1;j++)
		{
			lpPtr=(LPSTR)lpSrcDIB+(buffersizeinfo-bytesperline-i*bytesperline)+j;
			if(*lpPtr==0)
				if(*(lpPtr+width-1)+*(lpPtr+width)+*(lpPtr+width+1)+*(lpPtr-width-1)+*(lpPtr-width)+*(lpPtr-width+1)+*(lpPtr-1)+*(lpPtr)+*(lpPtr+1)==0)
					*lpPtr=char (255);
		}
	m_hDib=m_hDIBhere;
	GlobalUnlock(m_hDIBhere);
	return TRUE;
}

⌨️ 快捷键说明

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