我有A和B两张图片(352*288,32bit的图片),我现在想到
一张C图,大小同上,效果如下:
**********************
*                    *
*                    *
*                    *
*                    *
*         A          *
*                    *
*                    *
*                    *
*                    *
********************************************
*                    *
*                    *
*                    *
*                    *
*         B          *
*                    *
*                    *
*                    *
*                    *
**********************     ↓↓↓↓
**********************
* *                * *
*   *            *   *
*     *        *     *
*     *        *     *
*  B  *   A    *  B  *
*     *        *     *
*     *        *     *
*   *            *   *
* *                * *
**********************在第3张图片里,两边的B是平行正体梯形我现在已获取A和B的内存二进制的值了LPBYTE lpA,LPBYTE lpB
现在就是想得到第三张图的内存二进制值,但我自己对图像几何算法了解甚少,
不知道怎么写起,盼高手指点一二!!!!!

解决方案 »

  1.   

    做掩码图M,再分别从A、B中截出需要的部分,合到C就OK了
      

  2.   

    实际上这个并不涉及什么复杂的合成问题,既然大小相同,你只需要在内存中读取B的数据然后赋值到A图像数据中就可以了
    对于直接像素操作参考
    http://fxstudio.nease.net/article/graphic/58.txt
      

  3.   

    可以设定这样一个掩模:
    **********************
    ***                ***
    *****            *****
    *******        *******
    *******        *******
    *******        *******
    *******        *******
    *******        *******
    *****            *****
    ***                ***
    **********************
    设掩模为R,对图A,取R中无星号的部分
               对图B,取R中有星号的部分
    以上两个部分合成就可以了,上面两个操作可以写在同一个函数中
      

  4.   

    给你粗写一个
    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);
    }
      

  5.   

    cxian315 (峰)  :
    我需要您的帮助,请问怎样才能获取A和B的内存二进制的值。
    急切等待中。多谢谢。请发到
      

  6.   

    SongRN() :
    先看看这段代码,你看有没有帮助?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;}