19,468
社区成员
发帖
与我相关
我的任务
分享
//这是我在 使位图变成 灰度图函数中的处理 可是处理出来 一半是 彩色 一半是黑色的 全黑啊
//是循环的条件不对吗
UINT width = GetWidth();
UINT height = GetHeight();
DWORD dwWidthBytes = width * 3;//我用的是 24位真彩 3个字节一个像素啊
BYTE* pBitmapData = GetData();
for (int i = 0; i < height; i++)//是这边 有错吗
{
for(int j = 0; j < dwWidthBytes; j += 3)
{
*pBitmapData = (int)0.1*(*pBitmapData++);
*pBitmapData = (int)0.49*(*pBitmapData++);
*pBitmapData = (int)0.38*(*pBitmapData);
}
}
void CBmpDemoView::OnBmpHandleGray()
{
// TODO: Add your command handler code here
CDC *pDC=this->GetDC(); //获得设备上下文
//CRect m_rect;
//this->GetClientRect(&m_rect); //获得窗口客户区
COLORREF color;
BYTE r,g,b;
BYTE gray;
for(int i=0;i<m_BMInfo.bmWidth;i++)
for(int j=0;j<m_BMInfo.bmHeight;j++)
{
color=pDC->GetPixel(i,j); //获得颜色
r=GetRValue(color);
g=GetGValue(color);
b=GetBValue(color);
gray=(int)(0.38*r + 0.49*g + 0.1*b);//设置灰度颜色值
color=RGB(gray, gray, gray);
pDC->SetPixel(i, j, color); //用灰度颜色画点
}
}
typedef struct tagBITMAPINFO {
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[1]; //这里为什么是 长度大小为1 的数组啊 我看程序都好像不是啊
} BITMAPINFO;
//////////////
//下面lpmf是 指向BITMAPINFO结构体的指针 从循环看的化 color_num 不等于1的话 为什么不会越界啊
//上面的 结构体中 bmiColors[1]是 长度为1的数组啊、、、好乱啊 大家帮我回答一下 顶顶也好啊 谢谢了
if(color_num!=0)
{
for(int i=0;i<color_num;i++)
{
lpmf->bmiColors[i].rgbRed =(BYTE)i;
lpmf->bmiColors[i].rgbGreen =(BYTE)i;
lpmf->bmiColors[i].rgbBlue =(BYTE)i;
}
}