我使用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. VirtualBox虚拟机中启用usb3.0却无法显示u盘的解决方法
  2. android 点击连续拍照,android自定义相机、连续(自动)聚焦、点击(触摸)聚焦、变焦、拍照后自定义裁剪、旋转...
  3. mysql 左连接b表的一条数据_如果你正在找MySQL精品资源,那来这里看看
  4. jq.validate.js
  5. 关于flink的setCommitOffsetsOnCheckpoints
  6. android主动显示流程,Activity加载显示基本流程
  7. 再谈borland与MS对BUG的不同态度~
  8. 16款测序平台性能大PK,华大表现不俗!基于人类和细菌基因组DNA水平的多平台测序数据研究成果发布...
  9. 如何制作HTML5 SVG描边文字
  10. 移动站原生的select实现省市区联动选择
  11. HTAP数据库 PostgreSQL 场景与性能测试之 1 - (OLTP) 点查
  12. 考研英语 - word-list-23
  13. 没想到!2018微信年度数据报告显示使用最多的表情竟是...
  14. PDF文件拆分为单独页面且通过每页的相关内容重名命
  15. 26 | Superscalar和VLIW:如何让CPU的吞吐率超过1?
  16. 【九层之台】Web开发教程:0. 准备
  17. 如何在“一周内”摸清一个行业
  18. 荧光和明场图像融合 matlab,一种用于明场显微成像的多层图像融合算法
  19. 微信公众号上传图片功能
  20. 主板上的北桥芯片和南桥芯片的作用和区别详解

热门文章

  1. word转换成字符串
  2. IRM电源维修XRM65P50X3402高压发生器维修
  3. Oracle数据库查询十个小技巧
  4. Show一下拿的奖杯
  5. 理财入门-读《小狗钱钱》有感
  6. NI Multisim元件库:在Multisim中创建自定义元器件
  7. 全面保护个人电脑中的宝贵数据和文件(转)
  8. 神奇的Python图片处理库exifread
  9. 罗切斯特大学计算机科学硕士介绍,罗切斯特大学计算机科学硕士排名第61(2020年TFE Times排名)...
  10. HMAC_SHA1和SHA1的区别