我有A和B两张图片(352*288,32bit的图片),我现在想到
一张C图,大小同上,效果如下:
**********************
* *
* *
* *
* *
* A *
* *
* *
* *
* *
********************************************
* *
* *
* *
* *
* B *
* *
* *
* *
* *
********************** ↓↓↓↓
**********************
* * * *
* * * *
* * * *
* * * *
* B * A * B *
* * * *
* * * *
* * * *
* * * *
**********************在第3张图片里,两边的B是平行正体梯形我现在已获取A和B的内存二进制的值了LPBYTE lpA,LPBYTE lpB
现在就是想得到第三张图的内存二进制值,但我自己对图像几何算法了解甚少,
不知道怎么写起,盼高手指点一二!!!!!
一张C图,大小同上,效果如下:
**********************
* *
* *
* *
* *
* A *
* *
* *
* *
* *
********************************************
* *
* *
* *
* *
* B *
* *
* *
* *
* *
********************** ↓↓↓↓
**********************
* * * *
* * * *
* * * *
* * * *
* B * A * B *
* * * *
* * * *
* * * *
* * * *
**********************在第3张图片里,两边的B是平行正体梯形我现在已获取A和B的内存二进制的值了LPBYTE lpA,LPBYTE lpB
现在就是想得到第三张图的内存二进制值,但我自己对图像几何算法了解甚少,
不知道怎么写起,盼高手指点一二!!!!!
对于直接像素操作参考
http://fxstudio.nease.net/article/graphic/58.txt
**********************
*** ***
***** *****
******* *******
******* *******
******* *******
******* *******
******* *******
***** *****
*** ***
**********************
设掩模为R,对图A,取R中无星号的部分
对图B,取R中有星号的部分
以上两个部分合成就可以了,上面两个操作可以写在同一个函数中
PBYTE lpA, lpB;
int *lp0;//这个是已得得到的,其中lp0为掩模,如果是要取自A图的点设成1,其它点设成0
int* lpC = new int[352*288];//新建一个内存块,32位,所以用int来表示更为合适for (int y = 0; y<288; y++)
for (int x = 0; x<352;x++)
{
if (lp0[y*352+x])
{//取A中的点
lpC[y*352+x] = *(int*)(lpA + (y*352+x)*4);
}else
lpC[y*352+x] = *(int*)(lpB + (y*352+x)*4);
}
我需要您的帮助,请问怎样才能获取A和B的内存二进制的值。
急切等待中。多谢谢。请发到
先看看这段代码,你看有没有帮助?BOOL CompoundDIB(int left,int top,HANDLE hDIB,HANDLE hDIBSrc,HANDLE hDIBAlpha)
{
LPVOID lpvBuf=NULL; // 目标图象数据指针(背景)
LPVOID lpvBufSrc=NULL; // 源图数据指针(前景)
LPVOID lpvBufAlpha=NULL; // Alpha通道数据指针 // // 源图象信息 //
LPBITMAPINFO lpbmif=(LPBITMAPINFO)hDIBSrc;
LPBITMAPINFOHEADER lpbmifh=(LPBITMAPINFOHEADER)lpbmif;
// 计算图象数据偏移量
UINT nColors=lpbmifh->biClrUsed ? lpbmifh->biClrUsed : 1<<lpbmifh->biBitCount;
if ( nColors >256 )
nColors=0; // 如果颜色数大于256色,则没有调色板
lpvBufSrc=lpbmif->bmiColors+nColors;
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=lpbmif->bmiColors+nColors;
int cx=lpbmifh->biWidth;
int cy=lpbmifh->biHeight;
int nBytesPerLine=((cx*lpbmifh->biBitCount+31)&~31)/8; // // Alpha通道信息 //
lpbmif=(LPBITMAPINFO)hDIBAlpha;
lpbmifh=(LPBITMAPINFOHEADER)hDIBAlpha;
ASSERT(lpbmifh->biWidth==cxSrc && lpbmifh->biHeight==cySrc &&
lpbmifh->biBitCount==8 );
nColors=lpbmifh->biClrUsed ? lpbmifh->biClrUsed : 256;
lpvBufAlpha=lpbmif->bmiColors+nColors;
int nBytesPerLineAlpha=((cxSrc*8+31)&~31)/8; // // 用来读取颜色值的指针 //
LPBYTE lpbPnt=NULL;
LPBYTE lpbPntSrc=NULL;
LPBYTE lpbPntAlpha=NULL;
// // 通过alpha值合并两张图象的像素值 //
// 这里假设是24位真彩色图象,其他深度的图象处理方法可以以次类推
for ( int y=cySrc; y>0 ;y-- )
{
lpbPnt=(LPBYTE)lpvBuf+nBytesPerLine*(cy-top-cySrc+y-1)+left*3;
lpbPntSrc=(LPBYTE)lpvBufSrc+nBytesPerLineSrc*(y-1);
lpbPntAlpha=(LPBYTE)lpvBufAlpha+nBytesPerLineAlpha*(y-1);
for ( int x=0; x<cxSrc; x++ )
{
int alpha=*lpbPntAlpha++;
for ( int i=0 ;i<3 ;i++ )
*lpbPnt++=(*lpbPnt*(255-alpha)+*(lpbPntSrc++)*alpha)/255;
}
}
return TRUE;}