我使用GetPixel取720x576的像素点是,至少得2秒,当然取决于你取的图得多大

之前的做法

unsigned long PixelBuf[720] = {0};
void CPCI_Transfer_Data(CDC &mCDC)
{unsigned long R,G,B;unsigned long Y,U,V;int wide = PIC_W;int high = PIC_H;COLORREF colorref;memset(PixelBuf, 0, sizeof(PixelBuf)/4);//范围限定if(wide > 720)wide = 720;if(high > 576)high = 576;for (int i = 0; i < high; i++){    for (int j = 0; j < wide; j++){colorref = mCDC.GetPixel(j, i);R = GetRValue(colorref) & 0xff;G = GetGValue(colorref) & 0xff;B = GetBValue(colorref) & 0xff;Y = 0.299*R + 0.587*G + 0.114*B;U = 0.5*R - 0.4187*G - 0.0813*B + 128;V = 0.5*B - 0.1687*R - 0.3313*G + 128;if(j%2 == 0)PixelBuf[j] = (Y & 0xff) + (V & 0xff) * 0x100;elsePixelBuf[j] = (Y & 0xff) + (U & 0xff) * 0x100;  }//ALTERA_ReadWriteBlock(hALTERA, ALTERA_AD_BAR0, 0x400000+i*800*4+4, FALSE , PixelBuf, PIC_W*4, ALTERA_MODE_DWORD);}//ALTERA_WriteDword (hALTERA, ALTERA_AD_BAR0, 0x800020,0x1);}

改用CreateDIBSection

HBITMAP CreateDIBSection(HDC              hdc,const BITMAPINFO *pbmi,UINT             usage,VOID             **ppvBits,HANDLE           hSection,DWORD            offset
);

最好先看msdn https://docs.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-createdibsection

再看优秀的博客写的

CreateDIBSection最简单的形式仅需要第二和第四个参数

这是改用CreateDIBSection替代GetPixel

unsigned long PixelBuf[720] = {0};
void CPCI_Transfer_Data(BYTE * g_pBits)
{unsigned long R,G,B;unsigned long Y,U,V;int wide = PIC_W;int high = PIC_H;COLORREF colorref;memset(PixelBuf, 0, sizeof(PixelBuf)/4);//范围限定if(wide > 720)wide = 720;if(high > 576)high = 576;for (int y = 0; y < high; y++){    for (int x = 0; x < wide; x++){R = g_pBits[(PIC_H-1-y) * PIC_W * 3+ x * 3 + 2];G = g_pBits[(PIC_H-1-y) * PIC_W * 3+ x * 3 + 1];B = g_pBits[(PIC_H-1-y) * PIC_W * 3+ x * 3];Y = 0.299*R + 0.587*G + 0.114*B;U = 0.5*R - 0.4187*G - 0.0813*B + 128;V = 0.5*B - 0.1687*R - 0.3313*G + 128;if(x%2 == 0)PixelBuf[x] = (Y & 0xff) + (V & 0xff) * 0x100;elsePixelBuf[x] = (Y & 0xff) + (U & 0xff) * 0x100;  }//ALTERA_ReadWriteBlock(hALTERA, ALTERA_AD_BAR0, 0x400000+y*800*4+4, FALSE , PixelBuf, PIC_W*4, ALTERA_MODE_DWORD);}//ALTERA_WriteDword (hALTERA, ALTERA_AD_BAR0, 0x800020,0x1);}BYTE bmibuf[sizeof(BITMAPINFO) + 256 * sizeof(RGBQUAD)];
void drawCPCI(CDC *pDC, unsigned char *pBuf,int iKZ, int x, int y,int w, int h, int iW, int iH, CDC &dcMemory)
{int iZerox = iW/2 - 360;int iZeroy = iH/2 - 288;int iShowx = 0, iShowy = 0;if (iKZ==0){iShowx = iZerox + x;iShowy = iZeroy + y;}else{iShowx = iZerox + x/4;iShowy = iZeroy + y/8;}CString str1, str2;str1.Format("x : %d", x);str2.Format("y : %d", y);CDC dcMemoryNew;dcMemoryNew.CreateCompatibleDC(pDC);memset(bmibuf, 0, sizeof(bmibuf));BITMAPINFO* pbmi = (BITMAPINFO*)bmibuf;   pbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);pbmi->bmiHeader.biWidth = PIC_W;pbmi->bmiHeader.biHeight = PIC_H;pbmi->bmiHeader.biPlanes = 1;pbmi->bmiHeader.biBitCount = 24;pbmi->bmiHeader.biCompression = BI_RGB;HBITMAP g_hBmp;BYTE * g_pBits;g_hBmp = ::CreateDIBSection(dcMemoryNew, pbmi, DIB_RGB_COLORS, (void **)&g_pBits, 0, 0);dcMemoryNew.SelectObject(g_hBmp);if (iKZ == 0){dcMemoryNew.BitBlt(0, 0, w, h, &dcMemory, iShowx, iShowy, SRCCOPY);pDC->BitBlt(0, 0, w, h, &dcMemory, iShowx, iShowy, SRCCOPY);} else{iShowx += 180;iShowy += 144;dcMemoryNew.StretchBlt(0, 0, w, h, &dcMemory, iShowx, iShowy, w/2, h/2,SRCCOPY);pDC->StretchBlt(0, 0, w, h, &dcMemory, iShowx, iShowy, w/2, h/2,SRCCOPY);}dcMemoryNew.SelectObject(&g_picfont);dcMemoryNew.SetTextColor(RGB(0,0,0));dcMemoryNew.SetBkMode(TRANSPARENT);dcMemoryNew.TextOut(140, 0, str1);dcMemoryNew.TextOut(140, 30, str2);pDC->SelectObject(&g_picfont);pDC->SetTextColor(RGB(0,0,0));pDC->SetBkMode(TRANSPARENT);pDC->TextOut(140, 0, str1);pDC->TextOut(140, 30, str2);CPCI_Transfer_Data(g_pBits);DeleteObject(g_hBmp); DeleteDC(dcMemoryNew);}

对于以上代码踩过的两个坑

1. 参考别的博客从g_pBits中拿像素和用GetPixel拿的像素不一样,又是一顿google和bing. 之后想着先显示出来看看,一看显示的图成镜像了,小开心,这说明还有戏,经过理工男的直觉咔咔整成这样了,显示 正常.虽然整到凌晨一点多,但是开心的像个孩子去睡觉了.

         R = g_pBits[(PIC_H-1-y) * PIC_W * 3+ x * 3 + 2];G = g_pBits[(PIC_H-1-y) * PIC_W * 3+ x * 3 + 1];B = g_pBits[(PIC_H-1-y) * PIC_W * 3+ x * 3];

2. 之前排查视频卡闪烁的问题,不经意间将DeleteObject(g_hBmp)和DeleteDC(dcMemoryNew)注释掉了,噩梦开始了.在晚上联机测试我的方案时,就是以上代码,程序跑上几十秒就崩溃了,我就索性将局部变量大点的改成全局变量,不好使,由于是晚上九点多了加上四五个人等着我,实在没精神,收工. 第二天一早,感觉就是程序占用内存过大导致崩溃.程序运行起来,打开任务管理器,程序占用的内存呼呼的往上升,当打到1500M左右崩溃了,崩在g_pBits取值Access Violation.后来仔细审查代码,将注释打开,程序保持在2.7M左右,搞定.

切记:

     DeleteObject(g_hBmp); DeleteDC(dcMemoryNew);

说的很啰嗦, 望见谅

鸣谢: https://blog.csdn.net/zerocnd/article/details/4503939

为了拿到像素点,GetPixel的速度太慢,改用CreateDIBSection相关推荐

  1. ‘pip 安装第三方库速度太慢’的解决办法

    写在这里的初衷,一是备忘,二是希望得到高人指点,三是希望能遇到志同道合的朋友. 目录 pip 安装第三方库速度太慢 设置方法,以清华镜像源为例: pip 安装第三方库速度太慢 可设置 pip 从国内的 ...

  2. 解决Github速度太慢的几种方案

    Github速度太慢全网最全方案 近日,我在Github上下载源码,真的鸡肋,慢的一匹,通过以下方式,让我下载Github速度飞快,因为刚好有代理,就用的第一种方式,而后面几种方式参考自网上的一些方案 ...

  3. [vue] webpack打包vue速度太慢怎么办?

    [vue] webpack打包vue速度太慢怎么办? 升级webpack4,支持多进程 个人简介 我是歌谣,欢迎和大家一起交流前后端知识.放弃很容易, 但坚持一定很酷.欢迎大家一起讨论 主目录 与歌谣 ...

  4. mysql无序id怎么优化limit_MYSQL分页limit速度太慢优化方法

    原标题:MYSQL分页limit速度太慢优化方法 在mysql中limit可以实现快速分页,但是如果数据到了几百万时我们的limit必须优化才能有效的合理的实现分页了,否则可能卡死你的服务器哦. 当一 ...

  5. c语言比matlab慢很多,为什么我的Python脚本与Matlab相比速度太慢?

    我在考虑从Matlab切换到Python(NumPy).所以,作为一个学习任务,我试图在Python上重写一个简单的随机模型. python脚本返回正确的答案,但工作太慢! Python需要3分钟,而 ...

  6. 红米4a android 9 速度,雷军感叹科技进步速度太快!Redmi 9入门机性能已经相当于骁龙835...

    原标题:雷军感叹科技进步速度太快!Redmi 9入门机性能已经相当于骁龙835 由于市场竞争激烈,所以手机每一年都有很大的进步,包括性能.拍照.屏幕外观和快充等等很多方面.在这些配置中,手机性能的进步 ...

  7. ssd硬盘 速度慢 linux,固态硬盘速度太慢 快不起来?你或许犯了这四个SSD使用错误 (全文)...

    好不容易省吃俭用买了一块SSD固态硬盘,心情激动的安装.重装系统.开机后却怎么都觉得速度不对?当你开始怀疑是不是CPU.内存等配件拖慢你SSD速度的时候,有没有考虑是自己犯了下面这些错,拖慢了固态硬盘 ...

  8. 解决Google浏览器打开页面速度太慢问题

    看别人google打开的网页速度飞快,而自己的却慢的着急,所以在网上找了半天资料+自己摸索了一下午,终于解决了Google浏览器打开页面速度太慢的问题,下面是我自己遇到的一些问题,希望对大家有所帮助. ...

  9. yarn安装依赖速度太慢的解决办法

    本文介绍如何通过修改配置文件解决yarn安装依赖速度太慢的问题. 1.在用户目录文件夹下找到.yarnc文件 2.编辑.yarnc文件,添加如下内容 registry "https://re ...

最新文章

  1. NSOprationQueue 与 GCD 的区别与选用
  2. 我是如何用 Redis 做实时订阅推送的?
  3. WebGL on iOS8 最终等到了这一天
  4. 将矩阵转为一行_LeetCode 力扣官方题解 | 861. 翻转矩阵后的得分
  5. Alpha冲刺(7/10)
  6. 软件培训技术选哪个?
  7. 史上最全jmeter逻辑控制器案例详解
  8. h5 video 手机 显示第一帧_【图像处理二】HDMI显示(一)
  9. sqlserver 2008r2 查看表结构及视图、版本及数据类型(字段)
  10. 开发人员为什么要学会画技术架构图?
  11. AR.js专题-图片匹配
  12. cadz轴归零命令_CAD中所有图形实现统一标高(Z轴归零)的方法,统一标高的快捷键命令...
  13. 快速的APK厂商快速和免费的Andr​​oid应用程序生成器无需编码技巧
  14. 电压表c语言程序,数字电压表 数字电压表控制C语言程序.doc
  15. 关于影响力章节的读后感:第二章
  16. 【图神经网络】Pytorch图神经网络库——PyG基础操作
  17. 运放电路中何时加入偏置电流补偿电阻-运算放大器
  18. Linux 配置php
  19. Ubuntu磁盘扩充
  20. 欧姆龙PLC远程上下载实际操作分享

热门文章

  1. 数据归一化及两种常用归一化方法
  2. React的setState立即执行方案
  3. 计算物体自由下落距离
  4. BAT之变:瘦死的骆驼比马大
  5. Android视图绑定,设置控件点击事件不生效
  6. UPC 2020年夏混合个人训练第八十一场
  7. 学习Python后能找什么工作
  8. java trove_trove4j高性能Java集合库
  9. java手机游戏吸血鬼_Java 吸血鬼数字
  10. 回顾(JavaScript)Js正则表达式