新手求教:如何直接操作CDC啊!

shally5 2005-05-11 11:18:27
新手求教:如何直接操作CDC啊!
我想直接对视的CDC中的RGB通道字节进行操作,
比如,对红、绿、蓝通道按不同条件重新赋值。。
一般用CDC的SetPixel();太慢了
(因为加了很多层绘制)
多谢!
...全文
64 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
星辰游侠 2005-05-12
  • 打赏
  • 举报
回复
mark
shally5 2005-05-12
  • 打赏
  • 举报
回复
UP一下
qrlvls 2005-05-11
  • 打赏
  • 举报
回复
CSDN中以前的一段代码
void CComposeDoc::DrawFairy(HDC hDC, int left, int top, int mask)
{
LPBITMAPINFO lpbmif;
LPBITMAPINFOHEADER lpbmifh;
if ( m_hDIBFairy == NULL || m_hDIBBack == NULL ) // 分别是精灵图片的DIB对象和背景图片的DIB对象
return;
// // 得到精灵图片信息 //
lpbmifh=(LPBITMAPINFOHEADER)m_hDIBFairy;
lpbmif=(LPBITMAPINFO)m_hDIBFairy;

// 这里假设精灵图片的颜色深度为8位(256色)
ASSERT( lpbmifh->biBitCount==8 );

int cx=lpbmifh->biWidth; // 长度
int cy=lpbmifh->biHeight; // 宽度
int nBytesPerLineFairy=((lpbmifh->biWidth*lpbmifh->biBitCount+31)&~31)/8; // 每行字节数
UINT nColors=lpbmifh->biClrUsed ? lpbmifh->biClrUsed :
1<<lpbmifh->biBitCount; // 颜色数
LPVOID lpvBufFairy=lpbmif->bmiColors+nColors; // 精灵图片数据指针

// // 得到背景图片信息 //
lpbmif=(LPBITMAPINFO)m_hDIBBack;
lpbmifh=(LPBITMAPINFOHEADER)m_hDIBBack;

// 同样假设背景图片的颜色深度是8位(256色)
ASSERT( lpbmifh->biBitCount == 8 );

int cxBack=lpbmifh->biWidth; // 宽度
int cyBack=lpbmifh->biHeight; // 高度
int nBytesPerLineBack=((cxBack*lpbmifh->biBitCount+31)&~31)/8;// 每行字节数
nColors=lpbmifh->biClrUsed ? lpbmifh->biClrUsed :
1<<lpbmifh->biBitCount;
LPVOID lpvBufBack=lpbmif->bmiColors+nColors;// 背景图片数据指针

// // 创建精灵图片的临时DIB对象 //
int nSize=GlobalSize(m_hDIBFairy);
LPVOID lpvBufTemp=GlobalAlloc(0,nSize);
if ( lpvBufTemp == NULL )
return ;
memcpy(lpvBufTemp,m_hDIBFairy,nSize);

// 由于这里假设图片的颜色深度数8位的,用BYTE指针来表示一个像素
LPBYTE lpbBufFairy=NULL;
LPBYTE lpbBufBack=NULL;
for ( int y=cy; y>0; y-- )
{
// 读取的精灵图片数据指针
lpbBufFairy=(LPBYTE)lpvBufFairy+(y-1)*nBytesPerLineFairy;
// 相对位置的背景图片数据指针
lpbBufBack=(LPBYTE)lpvBufBack+(cyBack-top-cy+y-1)*nBytesPerLineBack+left;
for ( int x=0; x<cx; x++ )
{
// 如果当前像素等于我们设定的透明颜色索引值,修改当前像素索引值
if ( *lpbBufFairy == mask )
*lpbBufFairy = * lpbBufBack;
lpbBufFairy++;
lpbBufBack++;
}
}
// 画精灵图片到屏幕上
SetDIBitsToDevice(hDC,left,top,cx,cy,0,0,0,cy,lpvBufFairy,
(LPBITMAPINFO)m_hDIBFairy,DIB_RGB_COLORS);
// 回复原来的精灵图片数据
memcpy(m_hDIBFairy,lpvBufTemp,nSize);
GlobalFree(lpvBufTemp);
}

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧