8中常用圖像處理函數(shù)_第1頁
8中常用圖像處理函數(shù)_第2頁
8中常用圖像處理函數(shù)_第3頁
8中常用圖像處理函數(shù)_第4頁
8中常用圖像處理函數(shù)_第5頁
已閱讀5頁,還剩23頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

屮國團(tuán)象>閩扌紗阿屮國團(tuán)象>閩扌紗阿中國圖象圖形網(wǎng)中國圖象圖形網(wǎng)中國圖象圖形網(wǎng)中國圖象圖形網(wǎng)、、、、、、、、、、、、、、*函數(shù)名稱:VertMirror()參數(shù):LPSTRlpDIB//LPSTRlpDIB//指向源DIB圖像指針返回值:BOOL〃鏡像成功返回BOOL〃鏡像成功返回TRUE,否則返回FALSE。說明:該函數(shù)用來實(shí)現(xiàn)DIB圖像的垂直鏡像。、!*、!>、!>、!>、!>、!>、!>、!>、!>、!>、!>、!>、!>、!>、!>、!>、!>、!>BOOLWINAPIVertMirror(LPSTRlpDIB){//原圖象寬度LONGlWidth;//原圖象高度LONGlHeight;//原圖象的顏色數(shù)WORDwNumColors;//原圖象的信息頭結(jié)構(gòu)指針LPBITMAPINFOHEADERlpbmi;//指向原圖象和目的圖象的像素的指針LPBYTElpSrc,lpDst;//平移后剩余圖像在源圖像中的位置(矩形區(qū)域)CRectrectSrc;//指向原圖像像素的指針LPBYTElpDIBBits;//指向復(fù)制圖像像素的指針中國圖象圖形網(wǎng)中國圖象圖形網(wǎng)中國圖象圖形網(wǎng)中國圖象圖形網(wǎng)LPBYTElpNewDIBBits;//內(nèi)存句柄HLOCALh;//循環(huán)變量LONGi;//圖像每行的字節(jié)數(shù)LONGlLineBytes;//獲取圖象的信息頭結(jié)構(gòu)的指針lpbmi=(LPBITMAPINFOHEADER)lpDIB;//找到圖象的像素位置lpDIBBits=(LPBYTE)::FindDIBBits(lpDIB);//獲取圖象的寬度lWidth=::DIBWidth(lpDIB);//獲取圖象的高度lHeight=::DIBHeight(lpDIB);//獲取圖象的顏色數(shù)wNumColors=::DIBNumColors(lpDIB);//計(jì)算圖像每行的字節(jié)數(shù)lLineBytes=WIDTHBYTES(lWidth*(lpbmi->biBitCount));//暫時(shí)分配內(nèi)存,以保存新圖像h=LocalAlloc(LHND,lLineBytes);//分配內(nèi)存失敗,直接返回if(!h)returnFALSE;//鎖定內(nèi)存lpNewDIBBits=(LPBYTE)LocalLock(h);//如果是256色位圖或真彩色位圖if(wNumColors==256||wNumColors==0){//平移圖像,每次移動(dòng)一行for(i=0;i<lHeight/2;i++){//指向原圖象倒數(shù)第i行像素起點(diǎn)的指針lpSrc=(LPBYTE)lpDIBBits+lLineBytes函數(shù)名稱:*函數(shù)名稱:*RotateDIB()*參數(shù):*//目標(biāo)區(qū)域同樣要注意上下倒置的問題lpDst=(LPBYTE)lpDIBBits+lLineBytes*(lHeight-i-1);//備份一行memcpy(lpNewDIBBits,lpDst,lLineBytes);〃將倒數(shù)第i行像素復(fù)制到第i行memcpy(lpDst,lpSrc,lLineBytes);〃將第i行像素復(fù)制到第i行memcpy(lpSrc,lpNewDIBBits,lLineBytes);}}else{AfxMessageBox("只支持256色和真彩色位圖");//釋放內(nèi)存LocalUnlock(h);LocalFree(h);returnfalse;}//釋放內(nèi)存LocalUnlock(h);LocalFree(h);//返回returnTRUE;}、!>、!*、、、、、、、、、、屮國團(tuán)象>閩扌紗阿屮國團(tuán)象>閩扌紗阿屮國團(tuán)象>閩扌紗阿屮國團(tuán)象>閩扌紗阿中國圖象圖形網(wǎng)中國圖象圖形網(wǎng)中國圖象圖形網(wǎng)中國圖象圖形網(wǎng)LPSTRlpDIB//指向源DIB圖像指針iAngleint

說明:iAngle該函數(shù)用來實(shí)現(xiàn)DIB圖像的旋轉(zhuǎn)。HGLOBALWINAPIRotateDIB(LPSTRlpDIB,intiAngle){//原圖象寬度LONGlWidth;//原圖象高度LONGlHeight;//旋轉(zhuǎn)后圖象寬度LONGlNewWidth;//旋轉(zhuǎn)后圖象高度LONGlNewHeight;//原圖象的顏色數(shù)WORDwNumColors;//原圖象的信息頭結(jié)構(gòu)指針LPBITMAPINFOHEADERlpbmi,lpbmi0;//指向原圖象和目的圖象的像素的指針LPBYTElpSrc,lpDst;//指向原圖像像素的指針LPBYTElpDIBBits;//指向旋轉(zhuǎn)后圖像(像素)的指針LPBYTElpNewDIBBits;LPSTRlpNewDIB;//旋轉(zhuǎn)后新的DIB句柄HDIBhDIB;//循環(huán)變量LONGi,j,i0,j0;中國圖象圖形網(wǎng)中國圖象圖形網(wǎng)中國圖象圖形網(wǎng)中國圖象圖形網(wǎng)//原圖像每行的字節(jié)數(shù)LONGlLineBytes;//旋轉(zhuǎn)后圖像每行的字節(jié)數(shù)LONGlNewLineBytes;//旋轉(zhuǎn)角度的弧度doublefArcAngle;//旋轉(zhuǎn)角度的正弦和余弦floatfSin,fCos;//旋轉(zhuǎn)前圖象四個(gè)角的坐標(biāo)(以圖象中心為坐標(biāo)系原點(diǎn))floatfSrcX1,fSrcY1,fSrcX2,fSrcY2;floatfSrcX3,fSrcY3,fSrcX4,fSrcY4;//旋轉(zhuǎn)后圖象四個(gè)角的坐標(biāo)(以圖象中心為坐標(biāo)系原點(diǎn))floatfDstX1,fDstY1,fDstX2,fDstY2;floatfDstX3,fDstY3,fDstX4,fDstY4;//兩個(gè)中間量floatf1,f2;//找到圖象的像素位置lpDIBBits=(LPBYTE)::FindDIBBits(lpDIB);//獲取圖象的寬度lWidth=::DIBWidth(lpDIB);//獲取圖象的高度lHeight=::DIBHeight(lpDIB);//獲取圖象的顏色數(shù)wNumColors=::DIBNumColors(lpDIB);//獲取指向原位圖信息頭結(jié)構(gòu)的指針lpbmi0=(LPBITMAPINFOHEADER)lpDIB;//計(jì)算原圖像每行的字節(jié)數(shù)lLineBytes=WIDTHBYTES(lWidth*(lpbmi0->biBitCount));//將旋轉(zhuǎn)角度從度轉(zhuǎn)換到弧度fArcAngle=(iAngle*PI)/180.0;//計(jì)算旋轉(zhuǎn)角度的正弦fSin=(float)sin(fArcAngle);//計(jì)算旋轉(zhuǎn)角度的余弦fCos=(float)cos(fArcAngle);//計(jì)算原圖的四個(gè)角的坐標(biāo)(以圖像中心為坐標(biāo)系原點(diǎn))fSrcX1=(float)(-(lWidth-1)/2);fSrcY1=(float)((lHeight-1)/2);fSrcX2=(float)((lWidth-1)/2);fSrcY2=(float)((lHeight-1)/2);fSrcX3=(float)(-(lWidth-1)/2);fSrcY3=(float)(-(lHeight-1)/2);fSrcX4=(float)((lWidth-1)/2);fSrcY4=(float)(-(lHeight-1)/2);//計(jì)算新圖四個(gè)角的坐標(biāo)(以圖像中心為坐標(biāo)系原點(diǎn))fDstX1=fCos*fSrcX1+fSin*fSrcY1;fDstY1=-fSin*fSrcX1+fCos*fSrcY1;fDstX2=fCos*fSrcX2+fSin*fSrcY2;fDstY2=-fSin*fSrcX2+fCos*fSrcY2;fDstX3=fCos*fSrcX3+fSin*fSrcY3;fDstY3=-fSin*fSrcX3+fCos*fSrcY3;fDstX4=fCos*fSrcX4+fSin*fSrcY4;fDstY4=-fSin*fSrcX4+fCos*fSrcY4;//計(jì)算旋轉(zhuǎn)后的圖像實(shí)際寬度lNewWidth=(LONG)(max(fabs(fDstX4-fDstX1),fabs(fDstX3-fDstX2))+0.5);//計(jì)算旋轉(zhuǎn)后的圖像高度lNewHeight=(LONG)(max(fabs(fDstY4-fDstY1),fabs(fDstY3-fDstY2))+0.5);//計(jì)算旋轉(zhuǎn)后圖像每行的字節(jié)數(shù)lNewLineBytes=WIDTHBYTES(lNewWidth*lpbmi0->biBitCount);//計(jì)算兩個(gè)常數(shù)f1=(float)(-0.5*(lNewWidth-1)*fCos-0.5*(lNewHeight-1)*fSin+0.5*(lWidth-1));f2=(float)(0.5*(lNewWidth-1)*fSin-0.5*(lNewHeight-1)*fCos+0.5*(lHeight-1));//暫時(shí)分配內(nèi)存,以保存新圖像hDIB=(HDIB)::GlobalAlloc(GHND,lNewHeight*lNewLineBytes+*(LPDWORD)lpDIB+::PaletteSize(lpDIB));//分配內(nèi)存失敗,直接返回if(!hDIB)returnNULL;//鎖定內(nèi)存lpNewDIB=(LPSTR)::GlobalLock((HGLOBAL)hDIB);//復(fù)制DIB信息頭和調(diào)色板memcpy(lpNewDIB,lpDIB,*(LPDWORD)lpDIB+::PaletteSize(lpDIB));//獲取圖象的信息頭結(jié)構(gòu)的指針lpbmi=(LPBITMAPINFOHEADER)lpNewDIB;//更新DIB圖象的高度和寬度lpbmi->biWidth=lNewWidth;lpbmi->biHeight=lNewHeight;//找到新DIB像素的起始位置lpNewDIBBits=(LPBYTE)::FindDIBBits(lpNewDIB);//如果是256色位圖if(wNumColors==256){//旋轉(zhuǎn)后圖像每行for(i=0;i<lNewHeight;i++){//旋轉(zhuǎn)后圖象每列for(j=0;j<lNewWidth;j++){〃指向圖象第i行第j個(gè)像素的指針lpDst=(LPBYTE)lpNewDIBBits+lNewLineBytes*(lNewHeight-1-i)+j;//計(jì)算每個(gè)像素點(diǎn)在原圖象中的坐標(biāo)i0=(LONG)(-((float)j)*fSin+((float)i)*fCos+f2+0.5);j0=(LONG)(((float)j)*fCos+((float)i)*fSin+f1+0.5);//判斷是否在源圖象范圍之內(nèi)if((j0>=0)&&(j0<lWidth)&&(i0>=0)&&(i0<lHeight)){//指向源DIB圖象第i0行,第j0個(gè)象素的指針I(yè)pSrc=(LPBYTE)lpDIBBits+ILineBytes*(lHeight-1-i0)+jO;//復(fù)制象素*lpDst=*lpSrc;}else{//對(duì)于源圖中沒有的象素,直接賦值為255*((LPBYTE)lpDst)=255;}}}}//如果是24位真彩色位圖elseif(wNumColors==0){//旋轉(zhuǎn)后圖像每行for(i=0;i<lNewHeight;i++){//旋轉(zhuǎn)后圖象每列for(j=0;j<lNewWidth;j++){〃指向圖象第i行第j個(gè)像素的指針lpDst=(LPBYTE)lpNewDIBBits+lNewLineBytes*(lNewHeight-1-i)+3*j;//計(jì)算每個(gè)像素點(diǎn)在原圖象中的坐標(biāo)i0=(LONG)(-((float)j)*fSin+((float)i)*fCos+f2+0.5);j0=(LONG)(((float)j)*fCos+((float)i)*fSin+f1+0.5);//判斷是否在源圖象范圍之內(nèi)if((j0>=0)&&(j0<lWidth)&&(i0>=0)&&(i0<lHeight)){//指向源DIB圖象第i0行,第j0個(gè)象素的指針I(yè)pSrc=(LPBYTE)lpDIBBits+ILineBytes*(lHeight-1-i0)+3*jO;//復(fù)制象素memcpy(lpDst,lpSrc,3);}else{//對(duì)于源圖中沒有的象素,直接賦值為255memset(lpDst,255,3);}}

else{AfxMessageBox("只支持256色和真彩色位圖");//釋放內(nèi)存GlobalUnlock(hDIB);GlobalFree(hDIB);returnNULL;}//返回returnhDIB;}參數(shù):LPSTRlpDIBfloatfXZoomRatiofloatfYZoomRatio*、!>、!>、!>、!>、!*、、、、、、、、參數(shù):LPSTRlpDIBfloatfXZoomRatiofloatfYZoomRatio**函數(shù)名稱:ZoomDIB()*指向源DIB的指針X軸方向縮放比率-Y軸方向縮放比率*返回值:HGLOBAL-縮放成功返回新DIB句柄,否則返回NULL。**說明:該函數(shù)用來縮放DIB圖像,返回新生成DIB的句柄。*、!*、!>、!>、!>、!>、!>、!>、!>、!>、!>、!>、!>、!>、!>、!>、!>、!>、!>HGLOBALWINAPIZoomDIB(LPSTRlpDIB,floatfXZoomRatio,floatfYZoomRatio){//源圖像的寬度和高度LONGlWidth;LONGlHeight;//縮放后圖像的寬度和高度LONGlNewWidth;LONGlNewHeight;WORDwNumColors;//縮放后圖像的寬度(INewWidth',必須是4的倍數(shù))LONGlNewLineBytes;//指向源圖像的指針LPBYTElpDIBBits;//指向源象素的指針LPBYTElpSrc;//縮放后新DIB句柄HDIBhDIB;//指向縮放圖像對(duì)應(yīng)象素的指針LPBYTElpDst;//指向縮放圖像的指針LPSTRlpNewDIB;LPBYTElpNewDIBBits;//指向BITMAPINFO結(jié)構(gòu)的指針(Win3.0)LPBITMAPINFOHEADERlpbmi,lpbmi0;//指向BITMAPCOREINFO結(jié)構(gòu)的指針LPBITMAPCOREHEADERlpbmc;//循環(huán)變量(象素在新DIB中的坐標(biāo))LONGi;LONGj;//象素在源DIB中的坐標(biāo)LONGi0;LONGj0;//圖像每行的字節(jié)數(shù)LONGILineBytes;//找到源DIB圖像象素起始位置lpDIBBits=(LPBYTE)::FindDIBBits(lpDIB);//獲取圖像的寬度lWidth=::DIBWidth(lpDIB);//獲取圖像的高度lHeight=::DIBHeight(lpDIB);wNumColors=::DIBNumColors(lpDIB);lpbmi0=(LPBITMAPINFOHEADER)lpDIB;//計(jì)算圖像每行的字節(jié)數(shù)lLineBytes=WIDTHBYTES(lWidth*(lpbmi0->biBitCount));//計(jì)算縮放后的圖像實(shí)際寬度//此處直接加0.5是由于強(qiáng)制類型轉(zhuǎn)換時(shí)不四舍五入,而是直接截去小數(shù)部分lNewWidth=(LONG)(lWidth*fXZoomRatio+0.5);//計(jì)算新圖像每行的字節(jié)數(shù)lNewLineBytes=WIDTHBYTES(lNewWidth*(lpbmi0->biBitCount));//計(jì)算縮放后的圖像高度lNewHeight=(LONG)(lHeight*fYZoomRatio+0.5);//分配內(nèi)存,以保存新DIBhDIB=(HDIB)::GlobalAlloc(GHND,lNewLineBytes*lNewHeight+*(LPDWORD)lpDIB+::PaletteSize(lpDIB));//判斷是否內(nèi)存分配失敗if(hDIB==NULL){//分配內(nèi)存失敗returnNULL;}//鎖定內(nèi)存lpNewDIB=(LPSTR)::GlobalLock((HGLOBAL)hDIB);//復(fù)制DIB信息頭和調(diào)色板memcpy(lpNewDIB,lpDIB,*(LPDWORD)lpDIB+::PaletteSize(lpDIB));//找到新DIB象素起始位置lpNewDIBBits=(LPBYTE)::FindDIBBits(lpNewDIB);//獲取指針lpbmi=(LPBITMAPINFOHEADER)lpNewDIB;lpbmc=(LPBITMAPCOREHEADER)lpNewDIB;屮國團(tuán)象>閩扌紗阿屮國團(tuán)象>閩扌紗阿屮國(8屮國(8彖閩形阿中國圖象圖形網(wǎng)中國圖象圖形網(wǎng)中國圖象圖形網(wǎng)//更新DIB中圖像的高度和寬度if(IS_WIN30_DIB(lpNewDIB)){//對(duì)于Windows3.0DIBlpbmi->biWidth=lNewWidth;lpbmi->biHeight=lNewHeight;}else{//對(duì)于其它格式的DIBlpbmc->bcWidth=(unsignedshort)lNewWidth;lpbmc->bcHeight=(unsignedshort)lNewHeight;}if(wNumColors==256){//針對(duì)圖像每行進(jìn)行操作for(i=0;i<lNewHeight;i++){//針對(duì)圖像每列進(jìn)行操作for(j=0;j<lNewWidth;j++){//指向新DIB第i行,第j個(gè)象素的指針//注意此處寬度和高度是新DIB的寬度和高度lpDst=(LPBYTE)lpNewDIBBits+INewLineBytes*(INewHeight-1-i)+j;//計(jì)算該象素在源DIB中的坐標(biāo)i0=(LONG)(i/fYZoomRatio+0.5);j0=(LONG)(j/fXZoomRatio+0.5);//判斷是否在源圖范圍內(nèi)if((j0>=0)&&(j0<lWidth)&&(i0>=0)&&(i0<lHeight)){//指向源DIB第i0行,第jO個(gè)象素的指針lpSrc=(LPBYTE)lpDIBBits+lLineBytes*(lHeight-1-i0)+j0;//復(fù)制象素*lpDst=*lpSrc;}else{//對(duì)于源圖中沒有的象素,直接賦值為255*((LPBYTE)lpDst)=255;}}}}elseif(wNumColors==0){for(i=0;i<lNewHeight;i++){//針對(duì)圖像每列進(jìn)行操作for(j=0;j<lNewWidth;j++){//指向新DIB第i行,第j個(gè)象素的指針//注意此處寬度和高度是新DIB的寬度和高度lpDst=(LPBYTE)lpNewDIBBits+INewLineBytes(INewHeight-1-i)+3*j;//計(jì)算該象素在源DIB中的坐標(biāo)i0=(LONG)(i/fYZoomRatio+0.5);j0=(LONG)(j/fXZoomRatio+0.5);//判斷是否在源圖范圍內(nèi)if((j0>=0)&&(j0<lWidth)&&(i0>=0)&&(i0<lHeight)){//指向源DIB第i0行,第j0個(gè)象素的指針lpSrc=(LPBYTE)lpDIBBits+lLineBytes*(lHeight-1-i0)+3*j0;//復(fù)制象素memcpy(lpDst,lpSrc,3);}else{//對(duì)于源圖中沒有的象素,直接賦值為255memset(lpDst,255,3);}}}}//返回returnhDIB;J函數(shù)名稱:On256tograyscale()*說明:*該算法函數(shù)用來把256圖像轉(zhuǎn)化成灰度圖像*voidCCimageProcessingView::On256tograyscale(){//TODO:Addyourcommandhandlercodehere//獲取文檔指針CCimageProcessingDoc*pDoc=GetDocument();//指向DIB的指針LPSTRlpDIB;//指向DIB象素指針LPSTRlpDIBBits;//指向DIB的一個(gè)象素的指針BYTE*lpSrc;//顏色表中的顏色數(shù)目WORDwNumColors;//灰度映射表BYTEbGrayMap[256];//調(diào)色板索應(yīng)循環(huán)變量LONGi;//圖象高度循環(huán)變量LONGih;//圖象寬度循環(huán)變量LONGiw;//圖像寬度LONGlWidth;//圖像高度LONGlHeight;//圖像每行的字節(jié)數(shù)LONGOneLineBytes;f國團(tuán)象>閩屛鄉(xiāng)網(wǎng)f國團(tuán)象>閩屛鄉(xiāng)網(wǎng)f國團(tuán)象>閩屛鄉(xiāng)網(wǎng)f國團(tuán)象>閩屛鄉(xiāng)網(wǎng)中國圖象圖形網(wǎng)中國圖象圖形網(wǎng)中國圖象圖形網(wǎng)中國圖象圖形網(wǎng)//指向BITMAPINFO結(jié)構(gòu)的指針(Win3.0)LPBITMAPINFOlpbmi;//指向BITMAPCOREINFO結(jié)構(gòu)的指針(OS/2)LPBITMAPCOREINFOlpbmc;//表明是否是Win3.0DIB的標(biāo)記BOOLbWin30DIB;lpDIB=(LPSTR)::GlobalLock((HGLOBAL)pDoc->GetHDIB());//獲取指向BITMAPINFO結(jié)構(gòu)的指針(Win3.0)lpbmi=(LPBITMAPINFO)lpDIB;//獲取指向BITMAPCOREINFO結(jié)構(gòu)的指針(OS/2)lpbmc=(LPBITMAPCOREINFO)lpDIB;//鎖定DIB//獲取DIB中顏色表中的顏色數(shù)目wNumColors=::DIBNumColors(lpDIB);//判斷是否是256色位圖if(wNumColors!=256){MessageBox("不是256色位圖!”);//解除鎖定::GlobalUnlock((HGLOBAL)pDoc->GetHDIB());//返回return;}//更改光標(biāo)形狀BeginWaitCursor();//判斷是否是WIN3.0的DIBbWin30DIB=IS_WIN30_DIB(lpDIB);中國圖象圖形網(wǎng)中國圖象圖形網(wǎng)中國圖象圖形網(wǎng)中國圖象圖形網(wǎng)//將原圖象的調(diào)色板轉(zhuǎn)化為灰度調(diào)色板//建立原調(diào)色板索引與灰度調(diào)色板索引的映射關(guān)系for(i=0;i<256;i++){if(bWin30DIB){//對(duì)原256色調(diào)色板的每一表項(xiàng)計(jì)算對(duì)應(yīng)的灰度值bGrayMap[i]=(BYTE)(0.299*lpbmi->bmiColors[i].rgbRed+0.587*lpbmi->bmiColors[i].rgbGreen+0.114*lpbmi->bmiColors[i].rgbBlue+0.5);//建立灰度調(diào)色板//紅色分量lpbmi->bmiColors[i].rgbRed=i;//綠色分量lpbmi->bmiColors[i].rgbGreen=i;//藍(lán)色分量lpbmi->bmiColors[i].rgbBlue=i;//保留位lpbmi->bmiColors[i].rgbReserved=0;}else{//對(duì)原256色調(diào)色板的每一表項(xiàng)計(jì)算對(duì)應(yīng)的灰度值bGrayMap[i]=(BYTE)(0.299*lpbmc->bmciColors[i].rgbtRed+0.587*lpbmc->bmciColors[i].rgbtGreen+0.114*lpbmc->bmciColors[i].rgbtBlue+0.5);//建立灰度調(diào)色板//紅色分量lpbmc->bmciColors[i].rgbtRed=i;//綠色分量lpbmc->bmciColors[i].rgbtGreen=i;//藍(lán)色分量lpbmc->bmciColors[i].rgbtBlue=i;}}//找到DIB圖像象素起始位置lpDIBBits=::FindDIBBits(lpDIB);//獲取圖像寬度lWidth=::DIBWidth(lpDIB);//獲取圖像高度lHeight=::DIBHeight(lpDIB);//計(jì)算圖像每行的字節(jié)數(shù)OneLineBytes=WIDTHBYTES(lWidth*8);//更換原256色位圖的每個(gè)象素的顏色索引//每行for(ih=0;ih<lHeight;ih++){//每列for(iw=0;iw<lWidth;iw++){//指向DIB第ih行,第iw列的象素的指針I(yè)pSrc=(BYTE*)lpDIBBits+OneLineBytes*(lHeight-1-ih)+iw;//對(duì)256色位圖,其像素值是調(diào)色板索引值//對(duì)灰度圖,索引值就等于其灰度值//映射調(diào)色板索引*lpSrc=bGrayMap[*lpSrc];}}//替換當(dāng)前調(diào)色板為灰度調(diào)色板pDoc->GetDocPalette()->SetPaletteEntries(0,256,(LPPALETTEENTRY)lpbmi->bmiColors);//設(shè)置臟標(biāo)記pDoc->SetModifiedFlag(TRUE);//實(shí)現(xiàn)新的調(diào)色板OnDoRealize((WPARAM)m_hWnd,0);//更新視圖pDoc->UpdateAllViews(NULL);//解除鎖定::GlobalUnlock((HGLOBAL)pDoc->GetHDIB());//恢復(fù)光標(biāo)EndWaitCursor();LONGlLineBytes;//指向圖像信息頭結(jié)構(gòu)的指針LPBITMAPINFOHEADERlpbmi;//圖像的顏色數(shù)WORDwNumColors;//噪聲BYTENoiseValue;//計(jì)算圖像每行的字節(jié)數(shù)lpbmi=(LPBITMAPINFOHEADER)lpDIB;//計(jì)算圖像的高度和寬度lWidth=::DIBWidth(lpDIB);lHeight=::DIBHeight(lpDIB);//找到圖像像素的起始位置lpDIBBits=::FindDIBBits(lpDIB);//計(jì)算圖像的顏色數(shù)wNumColors=::DIBNumColors(lpDIB);//計(jì)算圖像每行的字節(jié)數(shù)lLineBytes=WIDTHBYTES(lWidth*lpbmi->biBitCount);//生成偽隨機(jī)種子srand((unsigned)time(NULL));//在圖像中加噪//如果是256色位圖if(wNumColors==256){for(j=0;j<lHeight;j++){for(i=0;i<lWidth;i++){//隨機(jī)的噪聲值NoiseValue=rand()/1024;//指向源圖像倒數(shù)第j行,第i個(gè)象素的指針I(yè)pSrc=(char*)lpDIBBits+ILineBytes*j+i;*中國圖象圖形網(wǎng)*中國圖象圖形網(wǎng)//在像素值中加入噪聲值*lpSrc=(BYTE)(((BYTE)*(lpSrc))*224/256+NoiseValue);}}}//如果是24位真彩色位圖elseif(wNumColors==0){for(j=0;j<lHeight;j++){for(i=0;i<lWidth;i++){NoiseValue=rand()/1024;//指向源圖像倒數(shù)第j行,第i個(gè)象素的指針I(yè)pSrc=(char*)lpDIBBits+ILineBytes*j+3*i;〃在每個(gè)像素的RGB分量中加入隨機(jī)的噪聲值*lpSrc++=(BYTE)(((BYTE)*(lpSrc++))*224/256+NoiseValue);*lpSrc++=(BYTE)(((BYTE)*(lpSrc++))*224/256+NoiseValue);*lpSrc++=(BYTE)(((BYTE)*(lpSrc++))*224/256+NoiseValue);}}}//如果既不是256色位圖也不是24位真彩色位圖,直接返回else{AfxMessageBox("只支持256色位圖和24位真彩色位圖”);returnfalse;}//返回returntrue;}屮國團(tuán)象>閩扌紗阿屮國團(tuán)象>閩扌紗阿、!>、!>、!>、!>、!>、!>、!>、!>、!*、、、、、、、、、、*中國圖象圖形網(wǎng)中國圖象圖形網(wǎng)中國圖象圖形網(wǎng)函數(shù)名稱:AdjustBrightness()*LPSTRlpDIB***LPSTRlpDIB**intdb**BOOL//操參數(shù)://指向源DIB圖像指針說明:TRUE,否則返回FALSE。該算法函數(shù)用來對(duì)256色位圖和24位真彩色位圖進(jìn)行亮度調(diào)整操作。、、、、、、、、、、、、、、、、、BOOLWINAPIAdjustBrightness(LPSTRlpDIB,intdb){BYTEr,g,b;BITMAPINFO*pbmi;WORDwNumColors;LONGi;LPSTRlpDIBBits;intnDelta;intiWidth,iHeight;if(lpDIB==NULL)returnFALSE;pbmi=(BITMAPINFO*)lpDIB;if(!pbmi)returnFALSE;wNumColors=::DIBNumColors(lpDIB);if(wNumColors==256){for(i=0;i<wNumColors;i++){pbmi->bmiColors[i].rgbRed=BOUND(pbmi->bmiColors[i].rgbRed+db,0,255);pbmi->bmiColors[i].rgbGreen=BOUND(pbmi->bmiColors[i].rgbGreen+db,0,255);pbmi->bmiColors[i].rgbBlue=BOUND(pbmi->bmiColors[i].rgbBlue+db,0,255);}}elseif(wNumColors==0){lpDIBBits=::FindDIBBits(lpDIB);nDelta=WIDTHBYTES((pbmi->bmiHeader.biBitCount)*(pbmi->bmiHeader.biWidth))-((pbmi->bmiHeader.biWidth)*(pbmi->bmiHeader.biBitCount)+7)/8;for(iHeight=0;iHeight<pbmi->bmiHeader.biHeight;iHeight++){for(iWidth=0;iWidth<pbmi->bmiHeader.biWidth;iWidth++){b=(BYTE)*(lpDIBBits);g=(BYTE)*(lpDIBBits+1);r=(BYTE)*(lpDIBBits+2);*lpDIBBits++=BOUND(b+db,0,255);*lpDIBBits++=BOUND(g+db,0,255);*lpDIBBits++=BOUND(r+db,0,255);}lpDIBBits+=nDelta;}}else{AfxMessageBox("只處理256色和24位位圖”);returnfalse;}returnTRUE;}函數(shù)名稱:AdjustColor()*LPSTRlpDIB**int*LPSTRlpDIB**intdr**BOOL//操參數(shù)://指向源DIB圖像指針說明:dgdbTRUE,否則返回FALSE。該算法函數(shù)用來對(duì)256色位圖和24位真彩色位圖進(jìn)行色調(diào)調(diào)整操作。、、、、、、、、、、、、、、、、、BOOLWINAPIAdjustColor(LPSTRlpDIB,intdr,intdg,intdb){BYTEr,g,b;BITMAPINFO*pbmi;WORDwNumColors;LONGi;LPSTRlpDIBBits;intnDelta;intiWidth,iHeight;if(lpDIB==NULL)returnFALSE;pbmi=(BITMAPINFO*)lpDIB;if(!pbmi)returnFALSE;wNumColors=::DIBNumColors(lpDIB);if(wNumColors==256){for(i=0;i<wNumColors;i++){pbmi->bmiColors[i].rgbRed=BOUND(pbmi->bmiColors[i].rgbRed+dr,0,255);pbmi->bmiColors[i].rgbGreen=BOUND(pbmi->bmiColors[i].rgbGreen+dg,0,255);pbmi->bmiColors[i].rgbBlue=BOUND(pbmi->bmiColors[i].rgbBlue+db,0,255);}}elseif(wNumColors==0){lpDIBBits=::FindDIBBits(lpDIB);nDelta=WIDTHBYTES((pbmi->bmiHeader.biBitCount)*(pbmi->bmiHeader.biWidth))-((pbmi->bmiHeader.biWidth)*(pbmi->bmiHeader.biBitCount)+7)/8;for(iHeight=0;iHeight<pbmi->bmiHeader.biHeight;iHeight++){for(iWidth=0;iWidth<pbmi->bmiHeader.biWidth;iWidth++){b=(BYTE)*(lpDIBBits);g=(BYTE)*(lpDIBBits+1);r=(BYTE)*(lpDIBBits+2);*lpDIBBits++=BOUND(b+db,0,255);*lpDIBBits++=BOUND(g+dg,0,255);*lpDIBBits++=BOUND(r+dr,0,255);}lpDIBBits+=nDelta;}}else{AfxMessageBox("只處理256色和24位位圖”);returnfalse;}returnTRUE;}函數(shù)名稱:AdjustCotrast()*LPSTRlpDIB***LPSTRlpDIB**intdc**BOOL//操參數(shù)://指向源DIB圖像指針說明:TRUE,否則返回FALSE。該算法函數(shù)用來對(duì)256色位圖和24位真彩色位圖進(jìn)行對(duì)比度調(diào)整操作。、、、、、、、、、、、、、、、、、BOOLWINAPIAdjustCotrast(LPSTRlpDIB,intdc){BYTEr,g,b;BITMAPINFO*pbmi;WORDwNumColors;LONGi;LPSTRlpDIBBits;intnDelta;intiWidth,iHeight;if(lpDIB==NULL)returnFALSE;pbmi=(BITMAPINFO*)lpDIB;if(!pbmi)returnFALSE;wNumColors=::DIBNumColors(lpDIB);if(wNumColors==256){for(i=0;i<wN

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論