📄 dib.cpp
字号:
{
*(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 + -