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

📄 envyimage.cpp

📁 该代码用于计算波段的TVI值,该代码来源于作业程序,属于实验程序
💻 CPP
📖 第 1 页 / 共 3 页
字号:
//////////////////////////////////////////////////////////////////////////
// 参数说明:int srcOrgx,int srcOrgy,int srcWidth,int srcHeight;  // 影象起始位置和长宽
//           int tarOrgx,int tarOrgy,int tarWidth,int tarHeight; // 显示窗口的起始位置和长宽
//           CDC* pDC; // 显示设备指针
//           DWORD s;  // 显示参数
// 函数功能: 该函数用于显示影象 
//////////////////////////////////////////////////////////////////////////
void CEnvyImage::DrawImage(int srcOrgx,int srcOrgy,int srcWidth,int srcHeight,CDC* pDC,int tarOrgx,int tarOrgy,int tarWidth,int tarHeight,DWORD srccy)
{
	HPALETTE hOldPalette;
	if(!m_displayCluster)
	{
		if(m_lpImage==NULL) return;
		
		// 如果调色板不为空,则将调色板选入设备上下文
		if(m_hpalette != NULL) {
			hOldPalette = ::SelectPalette(pDC->GetSafeHdc(), m_hpalette, TRUE);
		}
		pDC->SetStretchBltMode(STRETCH_DELETESCANS);// COLORONCOLOR
		
		// 在设备的origin位置上画出大小为size的图象
		::StretchDIBits(pDC->GetSafeHdc(), tarOrgx,tarOrgy,tarWidth,tarHeight,
			srcOrgx, srcOrgy,srcWidth,srcHeight,
			m_lpImage, m_bitmapInfo, DIB_RGB_COLORS, SRCCOPY);
		// 如果调色板不为空,则将调色板选入设备上下文
		if(m_hpalette != NULL) {
			::SelectPalette(pDC->GetSafeHdc(), hOldPalette, TRUE);
		}
	}
	else
	{
		if(m_lpClusterImage==NULL) return;
		
		// 如果调色板不为空,则将调色板选入设备上下文
		if(m_hClusterPalette != NULL) {
			hOldPalette = ::SelectPalette(pDC->GetSafeHdc(), m_hClusterPalette, TRUE);
		}
		pDC->SetStretchBltMode(STRETCH_DELETESCANS);
		
		// 在设备的origin位置上画出大小为size的图象
		::StretchDIBits(pDC->GetSafeHdc(), tarOrgx,tarOrgy,tarWidth,tarHeight,
			srcOrgx, srcOrgy,srcWidth,srcHeight,
			m_lpClusterImage, m_bitmapInfoCluster, DIB_RGB_COLORS, SRCCOPY);
		// 如果调色板不为空,则将调色板选入设备上下文
		if(m_hpalette != NULL) {
			::SelectPalette(pDC->GetSafeHdc(), hOldPalette, TRUE);
		}
	}
	
}
//////////////////////////////////////////////////////////////////////////
// 参数说明:BITMAPINFO* pBitmapinfo; // 影象信息头
// 函数功能:该函数利用给定的信息头创建对应的调色板
//////////////////////////////////////////////////////////////////////////
HPALETTE CEnvyImage::CreateDIBPalette(BITMAPINFO* pBitmapInfo)
{
	int				wNumColors; 
	LPLOGPALETTE	lpPal;      
	HPALETTE		hPal = NULL;
	HANDLE          hTemp;
	
	if( pBitmapInfo->bmiHeader.biClrUsed )
		wNumColors = pBitmapInfo->bmiHeader.biClrUsed;
	else
	{
		if( pBitmapInfo->bmiHeader.biBitCount==8 )
			wNumColors = 256;
		else
			wNumColors = 0;
	}
	
	if (wNumColors)
	{
		hTemp = GlobalAlloc(GHND, sizeof(DWORD) + sizeof(PALETTEENTRY)*wNumColors);
		lpPal = (PLOGPALETTE)GlobalLock(hTemp);
	//	lpPal = (LPLOGPALETTE)new BYTE[sizeof(LOGPALETTE)+sizeof(PALETTEENTRY)*wNumColors];
		lpPal->palVersion	= 0x300; /*????*/
		lpPal->palNumEntries= wNumColors;
		
		for( int i = 0;i<wNumColors;i++ )
		{
			lpPal->palPalEntry[i].peRed		= pBitmapInfo->bmiColors[i].rgbRed;
			lpPal->palPalEntry[i].peGreen	= pBitmapInfo->bmiColors[i].rgbGreen;
			lpPal->palPalEntry[i].peBlue	= pBitmapInfo->bmiColors[i].rgbBlue;
			lpPal->palPalEntry[i].peFlags	= 0;
		}
		hPal = CreatePalette( lpPal );
		if( hPal==NULL )
			AfxMessageBox("Create Palette Fail!");
		// 释放以分配的内存
	GlobalUnlock( hTemp );
	GlobalFree  ( hTemp );
	}
	
	return hPal;
}
///////////////////////////////////////////////////////////////////////
// 参数说明:int nwidth,int nheight,int savewidth; // 影象长宽和存储时每行的字节个数
//           int nBit;  // 一个想素对应的字节数
//           HPALETTE& hPalette,BITMAPINFO* &bitmapInfo; // 影象对应的调色板和信息头
// 函数说明:给raw格式文件填加头文件
//////////////////////////////////////////////////////////////////////
void CEnvyImage::CreatRawHeader(int nwidth,int nheight,int savewidth,int nbit,HPALETTE& hPalette,BITMAPINFO* &bitmapInfo)
{
	int i;
	if(bitmapInfo!=NULL) delete []bitmapInfo;
	//分配空间
	if(nbit==1)
	{
		bitmapInfo = (BITMAPINFO*) new BYTE[sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD)];
	}
	else
	{
		bitmapInfo=(BITMAPINFO*) new BYTE[sizeof(BITMAPINFO)];
	}
	//写bmp文件的文件头和信息头
	bitmapInfo->bmiHeader.biSize          =   sizeof(BITMAPINFO);
	bitmapInfo->bmiHeader.biWidth         =   nwidth;
	bitmapInfo->bmiHeader.biHeight        =   nheight;
	bitmapInfo->bmiHeader.biPlanes        =   1;
	bitmapInfo->bmiHeader.biCompression   =   0;
	bitmapInfo->bmiHeader.biXPelsPerMeter =   2834;
	bitmapInfo->bmiHeader.biYPelsPerMeter =   2834;
	bitmapInfo->bmiHeader.biClrImportant  =   0;
	
	if(nbit==1)
	{
		bitmapInfo->bmiHeader.biBitCount  =   8;
		bitmapInfo->bmiHeader.biClrUsed   =   0;
	}
	if(nbit==3)
	{
		bitmapInfo->bmiHeader.biBitCount  =   24;
		bitmapInfo->bmiHeader.biClrUsed   =   0;
	}
	
	bitmapInfo->bmiHeader.biSizeImage     =    nheight*savewidth;
	
	if(nbit==3)
	{
		bitmapInfo->bmiColors->rgbBlue     =    255;
		bitmapInfo->bmiColors->rgbGreen    =    255;
		bitmapInfo->bmiColors->rgbRed      =    255;
	}
	
	if(nbit==1)
	{
		LPBYTE lpByte;
		RGBQUAD* quad;
		lpByte = (BYTE*)bitmapInfo+sizeof(BITMAPINFOHEADER);
		quad = (RGBQUAD*)lpByte;

		for(i=0;i<256;i++)
		{
			quad->rgbBlue = i;
			quad->rgbGreen = i;
			quad->rgbRed = i;
			quad->rgbReserved = i;
			quad++;
		}

		// 删除已有的调色板
		if(hPalette!=NULL)
		{
			::DeleteObject(hPalette);
		}
		hPalette = CreateDIBPalette(bitmapInfo);

		// 删除空间
// 		delete quad;
	}
}
//////////////////////////////////////////////////////////////////////////
// 参数说明:const char* strPathName; // 文件名称
//           BOOL  bShare; // 共享方式
// 函数功能:用于映射文件
//////////////////////////////////////////////////////////////////////////
BOOL CEnvyImage::AttachMapFile(const char* strPathname, BOOL bShare) // for reading
{
	HANDLE hFile = ::CreateFile(strPathname, GENERIC_WRITE | GENERIC_READ,
		bShare ? FILE_SHARE_READ : 0,
		NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
	ASSERT(hFile != INVALID_HANDLE_VALUE);
	DWORD dwFileSize = ::GetFileSize(hFile, NULL);
	HANDLE hMap = ::CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, 0, NULL);
	DWORD dwErr = ::GetLastError();
	if(hMap == NULL) {
		AfxMessageBox("Empty bitmap file");
		return FALSE;
	}
	LPVOID lpvFile = ::MapViewOfFile(hMap, FILE_MAP_WRITE, 0, 0, 0); // map whole file
	ASSERT(lpvFile != NULL);
	/*if(((LPBITMAPFILEHEADER) lpvFile)->bfType != 0x4d42) {
		AfxMessageBox("Invalid bitmap file");
		DetachMapFile();
		return FALSE;
	}*/
	m_lpData = lpvFile;
	m_hFile = hFile;
	m_hMap = hMap;
	return TRUE;
}
//////////////////////////////////////////////////////////////////////////
// 函数功能: 断开文件映射
//////////////////////////////////////////////////////////////////////////
void CEnvyImage::DetachMapFile()
{
	if(m_hFile == NULL) return;
	::UnmapViewOfFile(m_lpData);
	::CloseHandle(m_hMap);
	::CloseHandle(m_hFile);
	m_hFile = NULL;
}
//////////////////////////////////////////////////////////////////////////
// 函数功能:获取影象波段数
//////////////////////////////////////////////////////////////////////////
int CEnvyImage::GetBand()
{
	return m_band;
}
//////////////////////////////////////////////////////////////////////////
// 函数功能: 获取影象数据指针
//////////////////////////////////////////////////////////////////////////
LPVOID CEnvyImage::GetData()
{
	return m_lpData;
}
//////////////////////////////////////////////////////////////////////////
// 函数功能:获取影象的长宽
//////////////////////////////////////////////////////////////////////////
int CEnvyImage::GetRow()
{
	return m_imageRow;
}

int CEnvyImage::GetCol()
{
	return m_imageCol;
}
//////////////////////////////////////////////////////////////////////////
// 函数功能:获取影象排列次序
//////////////////////////////////////////////////////////////////////////
int CEnvyImage::GetOrder()
{
	return m_pixelOrder;
}
//////////////////////////////////////////////////////////////////////////
// 函数功能:获取空的影象数据
//////////////////////////////////////////////////////////////////////////
LPBYTE CEnvyImage::GetEmptyClusterImage()
{
	if(m_lpClusterImage!=NULL) delete []m_lpClusterImage;
	m_clusterCol = (m_imageCol*8+31)/32*4; m_clusterRow = m_imageRow;
	m_lpClusterImage = new BYTE [m_clusterCol*m_imageRow];
	return m_lpClusterImage;
}
//////////////////////////////////////////////////////////////////////////
// 函数功能: 获取影象信息头
//////////////////////////////////////////////////////////////////////////
BITMAPINFO* CEnvyImage::GetEmptyClusterBitInf()
{
		if(m_bitmapInfoCluster==NULL)// delete []m_bitmapInfoCluster;
	m_bitmapInfoCluster = (BITMAPINFO*) new BYTE[sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD)];
	return m_bitmapInfoCluster;
}
//////////////////////////////////////////////////////////////////////////
// 函数功能:聚类影象调色板
//////////////////////////////////////////////////////////////////////////
int CEnvyImage::DisplatClusterImage()
{
	if(m_bitmapInfoCluster==0 || m_lpClusterImage==0) return -1;
	m_displayCluster = 1;
	// 删除已有的调色板
	if(m_hClusterPalette!=NULL)
	{
		::DeleteObject(m_hClusterPalette);
	}
	m_hClusterPalette = CreateDIBPalette(m_bitmapInfoCluster);
	return 1;
}
//////////////////////////////////////////////////////////////////////////
// 参数说明:int *nr,*nG,*nB;  // 存储每种类别对应的RGB通道灰度数
//           int nClass;  // 类别个数
// 函数功能:该函数用于改变每个聚类类别的显示颜色
//////////////////////////////////////////////////////////////////////////
void CEnvyImage::ChangeClassColor(int* nR,int* nG,int* nB, int nClass)
{
	if(m_bitmapInfoCluster==NULL) return;
		int i;
	LPBYTE lpByte;
	RGBQUAD* quad;
	lpByte = (BYTE*)m_bitmapInfoCluster+sizeof(BITMAPINFOHEADER);
	quad = (RGBQUAD*)lpByte;
	for(i=0;i<nClass;i++)
	{
		quad++;
		quad->rgbBlue = nB[i];
		quad->rgbGreen = nG[i];
		quad->rgbRed = nR[i];
		quad->rgbReserved = i;
	
	}


	// 设置调色板调色板
	if(m_hClusterPalette!=NULL)
	{
		::DeleteObject(m_hClusterPalette);
	}
	m_hClusterPalette = CreateDIBPalette(m_bitmapInfoCluster);
}
//////////////////////////////////////////////////////////////////////////
// 参数说明:int *nR,*nG,*nb; // 存储颜色
//           int nClass;  // 类别个数
// 函数功能:获取每个波段的显示颜色
//////////////////////////////////////////////////////////////////////////
void CEnvyImage::GetClassColor(int *nR, int *nG, int *nB,int nClass)
{
	if(nR==NULL || nG==NULL || nB==NULL) return;
	LPBYTE lpByte;
	RGBQUAD* quad;
	if(m_bitmapInfoCluster==NULL) return;
	lpByte = (BYTE*)m_bitmapInfoCluster+sizeof(BITMAPINFOHEADER);
	quad = (RGBQUAD*)lpByte;
	for(int i=0; i<nClass; i++)
	{
		nR[i] = quad[i+1].rgbBlue;
		nG[i] = quad[i+1].rgbGreen;
		nB[i] = quad[i+1].rgbBlue;
	}
}

int CEnvyImage::CreatTVIImage(LPBYTE lpImageSource,LPBYTE lpImageTarget,BITMAPINFO* bitmap,int red,int green,int blue,int band,int order,int gray,int row,int col,int saveCol)
{
 
	int i,j;

    CreatRawHeader(col,row,saveCol,gray,m_hpalette,m_bitmapInfo);

    if(gray==1)
	{
		memset(lpImageTarget,0L,row*saveCol);
	
		switch(order) {
			case 1:
			{
				double  max,min,a=0;
	            	max=0;min=2;
	
				for(i=0; i<row; i++)
				{
					for(j=0; j<col; j++)
					{
						if(*(lpImageSource+(i*col+j-1)*4+3)+*(lpImageSource+(i*col+j-1)*4+0)==0)
							*(lpImageTarget+(row-1-i)*saveCol+j)=0;
						else{
						a=sqrt((double(*(lpImageSource+(i*col+j-1)*4+3)-*(lpImageSource+(i*col+j-1)*4+0))/double(*(lpImageSource+(i*col+j-1)*4+3)+*(lpImageSource+(i*col+j-1)*4+0))+0.5));
						if(a>max)
							 max=a;
						 else if(a<min)
							 min=a;
						}        
						}
				}
				
		
				for(i=0; i<row; i++)
				{
					for(j=0; j<col; j++)
					{
							if(*(lpImageSource+(i*col+j-1)*4+3)+*(lpImageSource+(i*col+j-1)*4+0)==0)
							*(lpImageTarget+(row-1-i)*saveCol+j)=0;
							else{
				*(lpImageTarget+(row-1-i)*saveCol+j) =int (255*(sqrt(((*(lpImageSource+(i*col+j-1)*4+3)-*(lpImageSource+(i*col+j-1)*4+0))/(*(lpImageSource+(i*col+j-1)*4+3)+*(lpImageSource+(i*col+j-1)*4+0))+0.5))-min)/(max-min));
				}

⌨️ 快捷键说明

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