我现在在做图像合成,用到了alpha图像合成,在网上找到一些这方面的资料,看下面代码,但是我不知道这个最后计算出来的值,最后赋值到那去了 。 计算机公式 newPixeValR= (pixel1ValR*(255-Alpha)+pixel2ValR*Alpha)/255;
BOOL CompoundDIB(HANDLE hDIB,HANDLE hDIBSrc,int alpha) { LPVOID lpvBuf=NULL; // 目标图象数据指针
LPVOID lpvBufSrc=NULL; // 源图数据指针 // // 源图象信息 //
LPBITMAPINFO lpbmif=(LPBITMAPINFO)hDIBSrc; LPBITMAPINFOHEADER lpbmifh=(LPBITMAPINFOHEADER)lpbmif;
// 计算图象数据偏移量
UINT nColors=lpbmifh-> biClrUsed ? lpbmifh-> biClrUsed : 1 < <lpbmifh-> biBitCount; if ( nColors > 256 ) nColors=0; // 如果颜色数大于256色,则没有调色板
lpvBufSrc=(LPVOID)((LPBYTE)lpbmif-> bmiColors+nColors*sizeof(RGBQUAD));
int cxSrc=lpbmifh-> biWidth; // 源图象宽度
int cySrc=lpbmifh-> biHeight; // 源图象高度
// 计算图象每行的字节数(图象位数 x 图象宽度,如果不能被2整除则在每行后面添加一个0字节)
int nBytesPerLineSrc=((cxSrc*lpbmifh-> biBitCount+31)&~31)/8; // // 目标图象信息 //
lpbmif=(LPBITMAPINFO)hDIB;
lpbmifh=(LPBITMAPINFOHEADER)lpbmif;
nColors=lpbmifh-> biClrUsed ? lpbmifh-> biClrUsed : 1 < <lpbmifh-> biBitCount; if ( nColors > 256 ) nColors=0; lpvBuf=(LPVOID)((LPBYTE)lpbmif-> bmiColors+nColors*sizeof(RGBQUAD));
int cx=lpbmifh-> biWidth;
int cy=lpbmifh-> biHeight;
int nBytesPerLine=((cx*lpbmifh-> biBitCount+31)&~31)/8; LPBYTE lpbPnt=NULL;
LPBYTE lpbPntSrc=NULL;
// // 通过alpha值合并两张图象的像素值 //
// 这里假设是24位真彩色图象,其他深度的图象处理方法可以以次类推
for ( int y=(cy <cySrc ? cy : cySrc); y> 0 ;y-- ) { lpbPnt=(LPBYTE)lpvBuf+nBytesPerLine*(y-1);
lpbPntSrc=(LPBYTE)lpvBufSrc+nBytesPerLineSrc*(y-1);
for ( int x=0; x <(cx <cxSrc ? cx : cxSrc); x++ ) {
for ( int i=0 ;i <3 ;i++ )
*lpbPnt++=(*lpbPnt*(255-alpha)+*(lpbPntSrc++)*alpha)/255; //就是这最后算出来得值赋值到那了
}
}
return TRUE;
}
BOOL CompoundDIB(HANDLE hDIB,HANDLE hDIBSrc,int alpha) { LPVOID lpvBuf=NULL; // 目标图象数据指针
LPVOID lpvBufSrc=NULL; // 源图数据指针 // // 源图象信息 //
LPBITMAPINFO lpbmif=(LPBITMAPINFO)hDIBSrc; LPBITMAPINFOHEADER lpbmifh=(LPBITMAPINFOHEADER)lpbmif;
// 计算图象数据偏移量
UINT nColors=lpbmifh-> biClrUsed ? lpbmifh-> biClrUsed : 1 < <lpbmifh-> biBitCount; if ( nColors > 256 ) nColors=0; // 如果颜色数大于256色,则没有调色板
lpvBufSrc=(LPVOID)((LPBYTE)lpbmif-> bmiColors+nColors*sizeof(RGBQUAD));
int cxSrc=lpbmifh-> biWidth; // 源图象宽度
int cySrc=lpbmifh-> biHeight; // 源图象高度
// 计算图象每行的字节数(图象位数 x 图象宽度,如果不能被2整除则在每行后面添加一个0字节)
int nBytesPerLineSrc=((cxSrc*lpbmifh-> biBitCount+31)&~31)/8; // // 目标图象信息 //
lpbmif=(LPBITMAPINFO)hDIB;
lpbmifh=(LPBITMAPINFOHEADER)lpbmif;
nColors=lpbmifh-> biClrUsed ? lpbmifh-> biClrUsed : 1 < <lpbmifh-> biBitCount; if ( nColors > 256 ) nColors=0; lpvBuf=(LPVOID)((LPBYTE)lpbmif-> bmiColors+nColors*sizeof(RGBQUAD));
int cx=lpbmifh-> biWidth;
int cy=lpbmifh-> biHeight;
int nBytesPerLine=((cx*lpbmifh-> biBitCount+31)&~31)/8; LPBYTE lpbPnt=NULL;
LPBYTE lpbPntSrc=NULL;
// // 通过alpha值合并两张图象的像素值 //
// 这里假设是24位真彩色图象,其他深度的图象处理方法可以以次类推
for ( int y=(cy <cySrc ? cy : cySrc); y> 0 ;y-- ) { lpbPnt=(LPBYTE)lpvBuf+nBytesPerLine*(y-1);
lpbPntSrc=(LPBYTE)lpvBufSrc+nBytesPerLineSrc*(y-1);
for ( int x=0; x <(cx <cxSrc ? cx : cxSrc); x++ ) {
for ( int i=0 ;i <3 ;i++ )
*lpbPnt++=(*lpbPnt*(255-alpha)+*(lpbPntSrc++)*alpha)/255; //就是这最后算出来得值赋值到那了
}
}
return TRUE;
}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货