要求是开始显示一幅256色灰度图像, 再读进来一幅256色彩色图像
把第二幅图像象素值给第一张对应的位置点, 再显示出来,结果图像一片花的
我估计是第二次显示时调色板仍用第一张图像的调色板,所以不对
我在OnDraw里显示时传递第二张图像的调色板,问题还是一样。 不知道我的理解对不对?还是因为别的问题。 另外,如果在一幅图像里,一部分显示黑白灰度图像,一部分是彩色的
那图像保存时,调色板的信息怎样保存呢?
谢谢!!
把第二幅图像象素值给第一张对应的位置点, 再显示出来,结果图像一片花的
我估计是第二次显示时调色板仍用第一张图像的调色板,所以不对
我在OnDraw里显示时传递第二张图像的调色板,问题还是一样。 不知道我的理解对不对?还是因为别的问题。 另外,如果在一幅图像里,一部分显示黑白灰度图像,一部分是彩色的
那图像保存时,调色板的信息怎样保存呢?
谢谢!!
解决方案 »
- DLL中多设备求助
- 基本送分的!欢迎大家进来!!!
- 求救!为何这段代码无法显示图像呢
- 紧急求救:将分割窗口固定的思路,错在那里??
- 我在程序中需要取2次系统时间,然后计算时间间隔,单位为毫秒,用CTime类如何相减?
- 请问高手:怎样在局域网内另一台机器上建立一个文件夹?
- vc中创建透明窗体
- HID设备如何收发数据?需不需要类似串口通信的什么通信协议,
- 有关MFC的生存问题
- 大家现在是在什么平台下,进行VC程序开发的?(WIN98? WIN2k? or Other?)
- 我用两点求出一直线方程,在确定其他的点,然后画线,为什么不是直线?是精度问题,还是???高手指点[在线等待]
- 各位大侠救命win2000 server下为何得不到真正的IP
灰度图的调色板的EGB值都是一样的.而彩色图的一般不一样,所以不能共用
我在打开彩色的图像的时候创建了一个调色板,存在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;
}