我要将一张图片的一部分颜色处理一下
试了很多次老是不成功
希望大家能给我贴一段代码上来让我参考一下
不要用GetPixel和SetPixel太慢了
谢谢。
试了很多次老是不成功
希望大家能给我贴一段代码上来让我参考一下
不要用GetPixel和SetPixel太慢了
谢谢。
解决方案 »
- CButton 用了SetBitmap函数后贴出的图与按钮大小不一致
- 发送邮件问题
- 求两句话的翻译
- 请教一个c++语言的基础问题 "\r\n"起什么作用
- 急求教:ShowWindow(m_hWnd,SW_HIDE);竟然无法隐藏窗口!
- 有没有好的英文VC编程网站,介绍个把。
- 如何生成能够在没有装vc的机子上使用的可执行程序?? 我等你的回答
- 关于VS2010中UNICODE码和MULTI BYTES码的编译问题
- 在一个月内自学vc++且编一个进程调度程序。时间够嘛?如何编。
- 有关无模式属性表
- 关于SetDIBits的使用问题
- error C2227: “->adoEOF”的左侧必须指向类/结构/联合
如果是矩形,FillRect();如果要做锐化之类的,不要用GetPixel和SetPixel,直接用数据块的指针。
执行 for (int i = 0; i<255; i++)
{
bmpInfo.bmiColors[i].rgbReserved=0;
bmpInfo.bmiColors[i].rgbBlue=i;
bmpInfo.bmiColors[i].rgbGreen=i;
bmpInfo.bmiColors[i].rgbRed=i; }
后原来的BITMAPINFO数据都不对了
是不是要分配内存之类的????
这个bmiColors默认大小怎么只有一??
int GetDIBits(
HDC hdc, // handle to DC
HBITMAP hbmp, // handle to bitmap
UINT uStartScan, // first scan line to set
UINT cScanLines, // number of scan lines to copy
LPVOID lpvBits, // array for bitmap bits
LPBITMAPINFO lpbi, // bitmap data buffer
UINT uUsage // RGB or palette index
);
要的是lpvBits,这才图像真正的数据,根据大小for()循环处理比如 LPBYTE lp = lpvBits;for(int i= 0; i< lpbi.bmiHeader.biWidth *lpbi.bmiHeader.biHeight,i++) // biSizeImage也可以,但有些情况为0
{
if( *(lp+ i) > 127)
{
*(lp+ i) = 255;
}
else
{
*(lp+ i) = 0;
}
}如果是彩色32的,i+ = 4,分量做分别处理;
如果是彩色32的,i+ = 3,分量做分别处理;
void AlphaGetBlock(CDC* pDC,UINT x,UINT y,UINT cx,UINT cy,COLORREF *color)
{
//cx*bits/8必须被4整除 CDC hmemdc;
CBitmap hbitmap;
UINT bits;
bits=pDC->GetDeviceCaps(BITSPIXEL); if(cx*bits/8%4)AfxMessageBox(L"cx*bits/8%4 有余数"); hbitmap.CreateBitmap(cx,cy,1,bits,NULL);
hmemdc.CreateCompatibleDC(pDC);
hmemdc.SelectObject(&hbitmap);
hmemdc.BitBlt(0,0,cx,cy,pDC,x,y,SRCCOPY);
hbitmap.GetBitmapBits(cx*cy*bits/8,color);
hmemdc.DeleteDC();
hbitmap.DeleteObject();
}
//处理完了,再绘回DC
void AlphaCopyBlock(CDC* pDC,UINT x,UINT y,UINT cx,UINT cy,COLORREF *color)
{
CDC hmemdc;
CBitmap hCurrentBitmap,*hOldBitmap;
hmemdc.CreateCompatibleDC(pDC);
hCurrentBitmap.CreateBitmap(cx,cy,1,32,color);
hmemdc.SelectObject(&hCurrentBitmap);
pDC->BitBlt(x,y,cx,cy,&hmemdc,0,0,SRCCOPY);
hmemdc.SelectObject(&hOldBitmap);
hmemdc.DeleteDC();
hCurrentBitmap.DeleteObject();
}