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

📄 dib.cpp

📁 读入图像序列
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		{
			*(destImage+n*_widthBytes+m)=*(srcImage+(srcHeight-j-1)*srcwidthBytes+i);
		}
	::GlobalUnlock((HGLOBAL)_hDIB);
	::GlobalUnlock((HGLOBAL)m_hDIB);
	m_sizeDIB.cx=_widthBytes;
	m_sizeDIB.cy=_height;
	m_pPal=new CPalette;
	//if(!CreateDIBPalette(m_hDIB,m_pPal))
	//{delete m_pPal; m_pPal=NULL;}
	CreateDIBPalette(m_hDIB,m_pPal);
	delete m_pPal; 
	
	m_pPal=NULL;
}

void CDIB::SetEmpty()
{
		m_hDIB=NULL;
		m_pPal=NULL;
		m_sizeDIB=CSize(0,0);
}

BOOL CDIB::SaveDIB(LPCTSTR lpszPathName)
{
	CFile file;
	CFileException fe;
	if(!file.Open(lpszPathName,CFile::modeCreate|CFile::modeReadWrite|CFile::shareExclusive,&fe))
	{
	//	ReportSaveLoadException(lpszPathName,&fe,FALSE,AFX_IDP_INVALID_FILENAME);
		return FALSE;	
	}
	BOOL bSuccess=FALSE;
	TRY{
//		BeginWaitCursor();
		bSuccess=SaveDIB(m_hDIB,file);
		file.Close();
	}
	CATCH(CException,eSave){
		file.Abort();
//		EndWaitCursor();
//		ReportSaveLoadException(lpszPathName,eSave,TRUE,AFX_IDP_FAILED_TO_SAVE_DOC);
		return FALSE;
	}
	END_CATCH

//	EndWaitCursor();
	if(!bSuccess)
	{
		CString strMsg="无法保存BMP图像";
		MessageBox(NULL,strMsg,NULL,MB_ICONINFORMATION|MB_OK);			
	}
	return bSuccess;
}

BOOL CDIB::SaveDIB(HDIB hDib, CFile &file)
{
	BITMAPFILEHEADER bmfHdr;
	LPBITMAPINFOHEADER lpBI;
	DWORD dwDIBSize;
	if(hDib==NULL)
		return FALSE;
	lpBI=(LPBITMAPINFOHEADER)::GlobalLock((HGLOBAL)hDib);
	if(lpBI==NULL)
		return FALSE;
	if(!IS_WIN30_DIB(lpBI))
	{
		::GlobalUnlock((HGLOBAL)hDib);
		return FALSE;
	}
	bmfHdr.bfType=DIB_HEADER_MARKER;
	//计算文件总大小
	dwDIBSize=*(LPDWORD)lpBI+PaletteSize((LPSTR)lpBI);
	if((lpBI->biCompression==BI_RLE8)||(lpBI->biCompression==BI_RLE4))
		dwDIBSize+=lpBI->biSizeImage;
	else{
	
		DWORD dwBmBitsSize;
		dwBmBitsSize=WIDTHBYTES((lpBI->biWidth)*((DWORD)lpBI->biBitCount))*lpBI->biHeight;
		dwDIBSize+=dwBmBitsSize;
		lpBI->biSizeImage=dwBmBitsSize;
	}
	bmfHdr.bfSize=dwDIBSize+sizeof(BITMAPFILEHEADER);
	bmfHdr.bfReserved1=0;
	bmfHdr.bfReserved2=0;
	bmfHdr.bfOffBits=(DWORD)sizeof(BITMAPFILEHEADER)+*(LPDWORD)lpBI+PaletteSize((LPSTR)lpBI);
	//write:
	TRY{
		file.Write((LPSTR)&bmfHdr,sizeof(BITMAPFILEHEADER));
		file.WriteHuge(lpBI,dwDIBSize);	
	}
	CATCH(CFileException, e){
		::GlobalUnlock((HGLOBAL)hDib);
		THROW_LAST();
	}
	END_CATCH
	::GlobalUnlock((HGLOBAL)hDib);

	return TRUE;
}

BOOL CDIB::InteEqualize(LPSTR lpDIBBits, LONG lWidth, LONG lHeight)
{
	
	// 指向源图像的指针
	unsigned char*	lpSrc;
	
	// 临时变量
	LONG	lTemp;
	
	// 循环变量
	LONG	i;
	LONG	j;
	
	// 灰度映射表
	BYTE	bMap[256];
	
	// 灰度映射表
	LONG	lCount[256];
	
	// 图像每行的字节数
	LONG	lLineBytes;
	
	// 计算图像每行的字节数
	lLineBytes = WIDTHBYTES(lWidth * 8);
	
	// 重置计数为0
	for (i = 0; i < 256; i ++)
	{
		// 清零
		lCount[i] = 0;
	}
	
	// 计算各个灰度值的计数
	for (i = 0; i < lHeight; i ++)
	{
		for (j = 0; j < lWidth; j ++)
		{
			lpSrc = (unsigned char *)lpDIBBits + lLineBytes * i + j;
			
			// 计数加1
			lCount[*(lpSrc)]++;
		}
	}
	
	// 计算灰度映射表
	for (i = 0; i < 256; i++)
	{
		// 初始为0
		lTemp = 0;
		
		for (j = 0; j <= i ; j++)
		{
			lTemp += lCount[j];
		}
		
		// 计算对应的新灰度值
		bMap[i] = (BYTE) (lTemp * 255 / lHeight / lWidth);
		if(bMap[i]>255) bMap[i]=255;
		if(bMap[i]<0) bMap[i]=0;
	}
	
	// 每行
	for(i = 0; i < lHeight; i++)
	{
		// 每列
		for(j = 0; j < lWidth; j++)
		{
			// 指向DIB第i行,第j个象素的指针
			lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) + j;
			
			// 计算新的灰度值
			*lpSrc = bMap[*lpSrc];
		}
	}
	
	// 返回
				return TRUE;
				
}



CDIB::CDIB(CDIB* pDIB,int mywidth,int myheight)
{

	int i,j/*,m,n*/;

	int _widthBytes=WIDTHBYTES(8*mywidth);
	int srcWidth=pDIB->GetDIBSize().cx;
	int srcHeight=pDIB->GetDIBSize().cy;
	int srcwidthBytes=WIDTHBYTES(8*srcWidth);
	LPSTR lpbi,destLpbi;
	unsigned char* destImage, * srcImage;
	LPBITMAPINFOHEADER lpbmi,destLpbmi;
	HDIB _hDIB;
	_hDIB=pDIB->GetHDIB();
	lpbi=(LPSTR)::GlobalLock((HGLOBAL)_hDIB);
	if(NumColors(lpbi)!=256)//仅支持对256色位图提取子位图
	{
		MessageBox(NULL,"仅支持256位图!",NULL,MB_OK);
		::GlobalUnlock((HGLOBAL)_hDIB);
		SetEmpty();
		return;
	}
	if(!IS_WIN30_DIB(lpbi))
	{
		MessageBox(NULL,"仅支持WIN30位图!",NULL,MB_OK);
		::GlobalUnlock((HGLOBAL)_hDIB);
		SetEmpty();
		return;
	}
	WORD _paletteSize=pDIB->PaletteSize(lpbi);
	//	m_hDIB=(HDIB)::GlobalAlloc(GMEM_MOVEABLE|GMEM_ZEROINIT,sizeof(BITMAPINFOHEADER)+_paletteSize+_widthBytes*_height);
	m_hDIB=(HDIB)::GlobalAlloc(GMEM_MOVEABLE|GMEM_ZEROINIT,*(LPWORD)lpbi+_paletteSize+_widthBytes*myheight);
	if(m_hDIB==NULL)
	{
		::GlobalUnlock((HGLOBAL)_hDIB);
		SetEmpty();
		return;
	}
	destLpbi=(LPSTR)::GlobalLock((HGLOBAL)m_hDIB);
	::memcpy(destLpbi,lpbi,sizeof(BITMAPINFOHEADER)+_paletteSize);
	destLpbmi=(LPBITMAPINFOHEADER)destLpbi;
	lpbmi=(LPBITMAPINFOHEADER)lpbi;
	destLpbmi->biBitCount=8;
	destLpbmi->biClrUsed=256;
	destLpbmi->biHeight=myheight;
	destLpbmi->biWidth=mywidth;
	destLpbmi->biSizeImage=_widthBytes*myheight;
	destImage=(unsigned char*)FindDIBBits(destLpbi);
	srcImage=(unsigned char*)FindDIBBits(lpbi);
	/////////////////////////////////////////////////////////
	// 指向源图像的指针
   	//unsigned char*	lpSrc;
	int width,height;
	width=pDIB->m_sizeDIB.cx;
	height=pDIB->m_sizeDIB.cy;
	CString str;

	int tempw,temph;
	int tempinte;
//	int i,j;
	int myvalue[500][500];//图片大小不要超过800*800
	// 图像每行的字节数
	LONG	lLineBytes;
	// 计算图像每行的字节数
	lLineBytes = WIDTHBYTES(width * 8);
	if(mywidth<width&&myheight<height)
	{//缩小

		for(i = 0; i < myheight; i++)
			for(j = 0; j < mywidth; j++)
			{	// 指向DIB第i行,第j个象素的指针
				//lpSrc = (unsigned char*)lpDIBBits + lLineBytes1 * (myheight - 1 - i) + j;
				tempw=(int)(j*width/mywidth);
				temph=(int)(i*height/myheight);
				tempinte=*((unsigned char*)srcImage + lLineBytes * (height - 1 - temph) + tempw);
				myvalue[i][j] =tempinte;
				
			}
			
	}
	else if(mywidth>width&&myheight>height)
	{ 	
		    myvalue[0][0]=*((unsigned char*)srcImage + lLineBytes * (height - 1 ) + 0);
			myvalue[myheight-1][mywidth-1]=*((unsigned char*)srcImage + lLineBytes * (0) +width-1);
			myvalue[myheight-1][0]=*((unsigned char*)srcImage + lLineBytes * (0) + 0);;
			myvalue[0][mywidth-1]=*((unsigned char*)srcImage + lLineBytes * (height-1) + width-1);;
			int flag=0;
		    for(i=0;i<myheight;i++)
				for(j=0;j<mywidth;j++)
				{
					if(i==0&&j==0) flag=1;
					else if(i==0&&j==mywidth-1) flag=1;
					else if(i==myheight-1&&j==0) flag=1;
					else if(i==myheight-1&&j==mywidth-1) flag=1;
					else
					{
				 
						myvalue[0][j]=myvalue[0][0]+j*(myvalue[0][mywidth-1]-myvalue[0][0])/(mywidth-1);
						myvalue[myheight-1][j]=myvalue[myheight-1][0]+j*(myvalue[myheight-1][mywidth-1]-myvalue[myheight-1][0])/(mywidth-1);
					    myvalue[i][j]=myvalue[0][j]+i*(myvalue[myheight-1][j]-myvalue[0][j])/(myheight-1); 
                    
					}
				}
			
				
	}
	else AfxMessageBox("error");

		
	for(i=0;i<myheight;i++)
		for(j=0;j<mywidth;j++)
			if(myvalue[i][j]>255) myvalue[i][j]=255;
			else if(myvalue[i][j]<0) myvalue[i][j]=0;
						
			
     
	////////////////////////////////////////////////////////
	//int myvalue[500][500];
	for(i=0;i<myheight;i++)
		for(j=0;j<mywidth;j++)
		{
			//赋值,在此缩小,放大
		//	myvalue[i][j]=0;
             *(destImage+(myheight-i-1)*_widthBytes+j)=myvalue[i][j];
		}
		::GlobalUnlock((HGLOBAL)_hDIB);
		::GlobalUnlock((HGLOBAL)m_hDIB);
		m_sizeDIB.cx=_widthBytes;
		m_sizeDIB.cy=myheight;
		m_pPal=new CPalette;
		//if(!CreateDIBPalette(m_hDIB,m_pPal))
		//{delete m_pPal; m_pPal=NULL;}
		CreateDIBPalette(m_hDIB,m_pPal);
		delete m_pPal; m_pPal=NULL;
	
}

⌨️ 快捷键说明

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