setpixel,getpixel效率太低的问题
来源:互联网 发布:mac 重做系统 编辑:程序博客网 时间:2024/04/27 13:42
setpixel,getpixel效率很低,尤其是在循环里面去这么做,速度慢的无法忍受,
用bitblt做了优化,代码如下,
原函数如下:
void gdiRectangleAlpha(HDC hdc,const RECT *rect,COLORREF color, unsigned char alpha)
{
if (!rect || !hdc)
{
return;
}
int xMin = rect->left;
int yMin = rect->top;
int xMax = rect->right;
int yMax = rect->bottom;
int x,y;
int r = GetRValue(color);
int g = GetGValue(color);
int b = GetBValue(color);
COLORREF clSrc;
int rSrc;
int gSrc;
int bSrc;
for (y = yMin; y < yMax; y++)
{
for (x = xMin; x < xMax; x++)
{
clSrc = GetPixel(hdc,x,y);
rSrc = GetRValue(clSrc);
gSrc = GetGValue(clSrc);
bSrc = GetBValue(clSrc);
rSrc = (rSrc * alpha + r * (255 - alpha)) >>8;
gSrc = (gSrc * alpha + g * (255 - alpha)) >>8;
bSrc = (bSrc * alpha + b * (255 - alpha)) >>8;
SetPixel(hdc,x,y,RGB(rSrc,gSrc,bSrc));
}
}
}
优化后的实现
void gdiRectangleAlpha(HDC hdc,const RECT *rect,COLORREF color, unsigned char alpha)
{
BYTE * g_pBits;
HDC g_hMemDC;
HBITMAP g_hBmp, g_hOldBmp;
if (!rect || !hdc)
{
return;
}
int xMin = rect->left;
int yMin = rect->top;
int xMax = rect->right;
int yMax = rect->bottom;
int x,y;
byte r = GetRValue(color);
byte g = GetGValue(color);
byte b = GetBValue(color);
COLORREF clSrc;
unsigned char rSrc;
unsigned char gSrc;
unsigned char bSrc;
g_hMemDC = ::CreateCompatibleDC(hdc);
if (!g_hMemDC)
{
::DeleteDC(hdc);
}
int iWidth = rect->right - rect->left;
int iHeight = rect->bottom - rect->top;
BYTE bmibuf[sizeof(BITMAPINFO) + 256 * sizeof(RGBQUAD)];
memset(bmibuf, 0, sizeof(bmibuf));
BITMAPINFO* pbmi = (BITMAPINFO*)bmibuf;
// BITMAPINFO pbmi;
pbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
pbmi->bmiHeader.biWidth = iWidth;
pbmi->bmiHeader.biHeight = iHeight;
pbmi->bmiHeader.biPlanes = 1;
pbmi->bmiHeader.biBitCount = 24;
pbmi->bmiHeader.biCompression = BI_RGB;
g_hBmp = ::CreateDIBSection(g_hMemDC, pbmi, DIB_RGB_COLORS, (void **)&g_pBits, 0, 0);
if (!g_hBmp)
{
::DeleteDC(g_hMemDC);
}
g_hOldBmp = (HBITMAP)::SelectObject(g_hMemDC, g_hBmp);
BitBlt(g_hMemDC,0,0,iWidth,iHeight,hdc,0,0,SRCCOPY);
// offset = y * (width * 24 / 8) + x * (24 / 8)
for (y = 0; y < iHeight; y++)
{
for (x = 0; x < iWidth; x++)
{
rSrc = g_pBits[y * iWidth * 3 + x * 3 + 2];
gSrc = g_pBits[y * iWidth * 3 + x * 3 + 1];
bSrc = g_pBits[y * iWidth * 3 + x * 3];
rSrc = (rSrc * alpha + r * (255 - alpha)) >>8;
gSrc = (gSrc * alpha + g * (255 - alpha)) >>8;
bSrc = (bSrc * alpha + b * (255 - alpha)) >>8;
g_pBits[y * iWidth * 3 + x * 3 + 2] = rSrc;
g_pBits[y * iWidth * 3 + x * 3 + 1] = gSrc;
g_pBits[y * iWidth * 3 + x * 3] = bSrc;
}
}
BitBlt(hdc, 0, 0, iWidth, iHeight, g_hMemDC, 0, 0, SRCCOPY);
SelectObject(g_hMemDC, g_hOldBmp);
DeleteObject(g_hBmp);
DeleteDC(g_hMemDC);
ReleaseDC(NULL, hdc);
}
- setpixel,getpixel效率太低的问题
- 解决 C# GetPixel 和 SetPixel 效率问题
- C# GetPixel and SetPixel
- GetPixel SetPixel bitbil
- 关于CDC::SetPixel和CDC::LineTo的效率问题
- 效率太低了
- 虚拟内存太低的问题
- AS3 的BitmapData的setPixel与getPixel时,值不相同。
- getPixel()和getRGB()的问题
- 老汉推车,效率太低了
- 吴敬琏:我国城市化主要问题是效率太低-吴敬琏-城市化-效率太低
- C#中HttpWebRequest的GetRequestStream执行的效率太低,甚至偶尔死掉
- C#中HttpWebRequest的GetRequestStream执行的效率太低,甚至偶尔死掉
- C#中HttpWebRequest的GetRequestStream执行的效率太低,甚至偶尔死掉
- MySQL的in查询效率太低的解决办法之一与其它优化示例
- android中java 版本太低的问题
- Python字典key值查询效率低的问题
- MYSQL随机调用order by rand(),效率太低
- Linux结束执行中的进程
- 常用数学符号读法大全
- TransparentBlt、StretchBlt与BitBlt三个函数的区别
- C#实现目标路径下文件递归的类
- C++中指针和引用的区别
- setpixel,getpixel效率太低的问题
- 老板法则
- Array和ArrayList的区别
- Centos5下搭建tomcat服务及java应用的部署和管理
- 判断浏览器类型
- 邮件发送
- 设计模式概述
- webservice 上传下载 大文件
- ftp文件下载、上传