📄 envyimage.cpp
字号:
//////////////////////////////////////////////////////////////////////////
// 参数说明: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 + -