我使用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. 楼宇自控ba系统 服务器,楼宇自控BA系统
  2. 学术杂谈|一篇所有研究生都该读的好文:阳光温热 科研静好!
  3. mysql列不明确_PHP和MYSQL:如何解决JOIN操作中不明确的列名?
  4. mybatis-generator逆向工程设置不生成Example类
  5. 本地存储和服务器存储
  6. 佳能Canon imageCLASS MF742Cdw 一体机驱动
  7. 科学健脑,让IQ更上一层楼
  8. MapperReduce初学附加自定义输出的NameWordCount统计
  9. 六、Kali Linux 2 远程控制
  10. 一日一技:Python + Excel——飞速处理数据分析与处理
  11. premiere调色预设怎么用
  12. Qt撤销回/撤框架:QUndoCommand
  13. 初入职场,菜鸟北漂记
  14. 【Excel办公技能图文教程】
  15. 吉大计算机学院宣讲,计算机科学与技术学院“喜迎十九大,争做学校宣传员”寒假社会实践系列报道(十六)...
  16. 安全生产预警系统软件解决方案
  17. 极光推送Cordova插件适配Capacitor
  18. dell 工作站装linux_dell 工作站装linux_个人电脑只装Linux是怎样的体验?
  19. 一个数的因子、因数的区别
  20. 妙赞大讲糖:糖友食谱的三不宜

热门文章

  1. php查找判断二维数组中是否含有某个值
  2. pycharm中配置华为云服务器
  3. 用于自然语言理解的多任务深度神经网络
  4. 利用Python爬取小说(附源码)
  5. Vue2父传子、子传父和兄弟间互传
  6. 各大AI 开放平台一览
  7. 微信小程序中商品列表 不显示
  8. [eNSP]→静态路由、负载分担、备用链路
  9. e.target.dataset和e.currentTarget.dataset
  10. 内蒙古大学计算机学院保研到哪些学校,关于2021年推荐优秀应届本科毕业生免试攻读研究生的通知...