要求是开始显示一幅256色灰度图像,  再读进来一幅256色彩色图像
把第二幅图像象素值给第一张对应的位置点, 再显示出来,结果图像一片花的 
我估计是第二次显示时调色板仍用第一张图像的调色板,所以不对 
我在OnDraw里显示时传递第二张图像的调色板,问题还是一样。   不知道我的理解对不对?还是因为别的问题。 另外,如果在一幅图像里,一部分显示黑白灰度图像,一部分是彩色的 
那图像保存时,调色板的信息怎样保存呢?
谢谢!!

解决方案 »

  1.   

    256色彩色图和灰度图都有调色板,真彩的没有调色板
    灰度图的调色板的EGB值都是一样的.而彩色图的一般不一样,所以不能共用
      

  2.   

    明白.
    我在打开彩色的图像的时候创建了一个调色板,存在m_palCurDIB
    第二次显示时,用这个调色板
    帮我看看吧:
    OnDraw():
      ......
        if(!Changed)
    {
    m_palCurDIB = pDoc->GetDocPalette();
    }
       .....
       // 输出DIB
    ::PaintDIB(pDC->m_hDC, &rcDest, pDoc->GetHDIB(),
    &rcDIB, m_palCurDIB);
           ......把第二张的像素值传给第一张图像的像素值,由pDoc->GetHDIB()可以得到指向hDIB的指针,再用当前m_palCurDIB
    因为Changed的指改变了,所以就不用原先的调色板了
    可为什么还是不对呢?PaintDIB:
    /*************************************************************************
     *
     * 函数名称:
     *   PaintDIB()
     *
     * 参数:
     *   HDC hDC            - 输出设备DC
     *   LPRECT lpDCRect    - 绘制矩形区域
     *   HDIB hDIB          - 指向DIB对象的指针
     *   LPRECT lpDIBRect   - 要输出的DIB区域
     *   CPalette* pPal     - 指向DIB对象调色板的指针
     *
     * 返回值:
     *   BOOL               - 绘制成功返回TRUE,否则返回FALSE。
     *
     * 说明:
     *   该函数主要用来绘制DIB对象。其中调用了StretchDIBits()或者
     * SetDIBitsToDevice()来绘制DIB对象。输出的设备由由参数hDC指
     * 定;绘制的矩形区域由参数lpDCRect指定;输出DIB的区域由参数
     * lpDIBRect指定。
     *
     ************************************************************************/BOOL WINAPI PaintDIB(HDC     hDC,
    LPRECT  lpDCRect,
    HDIB    hDIB,
    LPRECT  lpDIBRect,
    CPalette* pPal)
    {
    LPSTR    lpDIBHdr;            // BITMAPINFOHEADER指针
    LPSTR    lpDIBBits;           // DIB象素指针
    BOOL     bSuccess=FALSE;      // 成功标志
    HPALETTE hPal=NULL;           // DIB调色板
    HPALETTE hOldPal=NULL;        // 以前的调色板 // 判断DIB对象是否为空
    if (hDIB == NULL)
    {
    // 返回
    return FALSE;
    } // 锁定DIB
    lpDIBHdr  = (LPSTR) ::GlobalLock((HGLOBAL) hDIB); // 找到DIB图像象素起始位置
    lpDIBBits = ::FindDIBBits(lpDIBHdr); // 获取DIB调色板,并选中它
    if (pPal != NULL)
    {
    hPal = (HPALETTE) pPal->m_hObject; // 选中调色板
    hOldPal = ::SelectPalette(hDC, hPal, TRUE);
    } // 设置显示模式
    ::SetStretchBltMode(hDC, COLORONCOLOR); // 判断是调用StretchDIBits()还是SetDIBitsToDevice()来绘制DIB对象
    if ((RECTWIDTH(lpDCRect)  == RECTWIDTH(lpDIBRect)) &&
       (RECTHEIGHT(lpDCRect) == RECTHEIGHT(lpDIBRect)))
    {
    // 原始大小,不用拉伸。
    bSuccess = ::SetDIBitsToDevice(hDC,                    // hDC
       lpDCRect->left,             // DestX
       lpDCRect->top,              // DestY
       RECTWIDTH(lpDCRect),        // nDestWidth
       RECTHEIGHT(lpDCRect),       // nDestHeight
       lpDIBRect->left,            // SrcX
       (int)DIBHeight(lpDIBHdr) -
      lpDIBRect->top -
      RECTHEIGHT(lpDIBRect),   // SrcY
       0,                          // nStartScan
       (WORD)DIBHeight(lpDIBHdr),  // nNumScans
       lpDIBBits,                  // lpBits
       (LPBITMAPINFO)lpDIBHdr,     // lpBitsInfo
       DIB_RGB_COLORS);            // wUsage
    }
        else
    {
    // 非原始大小,拉伸。
    bSuccess = ::StretchDIBits(hDC,                          // hDC
       lpDCRect->left,                 // DestX
       lpDCRect->top,                  // DestY
       RECTWIDTH(lpDCRect),            // nDestWidth
       RECTHEIGHT(lpDCRect),           // nDestHeight
       lpDIBRect->left,                // SrcX
       lpDIBRect->top,                 // SrcY
       RECTWIDTH(lpDIBRect),           // wSrcWidth
       RECTHEIGHT(lpDIBRect),          // wSrcHeight
       lpDIBBits,                      // lpBits
       (LPBITMAPINFO)lpDIBHdr,         // lpBitsInfo
       DIB_RGB_COLORS,                 // wUsage
       SRCCOPY);                       // dwROP
    }

        // 解除锁定
    ::GlobalUnlock((HGLOBAL) hDIB);

    // 恢复以前的调色板
    if (hOldPal != NULL)
    {
    ::SelectPalette(hDC, hOldPal, TRUE);
    }

    // 返回
    return bSuccess;
    }