最近弄个取制定图片的RGB值,遇到了数据量大程序会假死的问题,想了好久只能向前辈请教了,分不多还请谅解代码如下
CString m_clrText;
for(i = 0; i < cxDIB; i++)
{
for(j = 0; j <cyDIB; j++)
{
clr = ::GetPixel(hDC,i,j); 
m_clrText.Format("%02x ",GetRValue(clr));
m_strRGB += m_clrText;
m_clrText.Format("%02x ",GetGValue(clr));
m_strRGB += m_clrText;
m_clrText.Format("%02x ",GetBValue(clr));
m_strRGB += m_clrText;
m_strRGB += "00 ";
}
}
如果我的图片像素比较多 比如256*256(cxDIB = 256 cyDIB = 256) 操作起来程序就会假死,请问我该怎么处理,多线程的东西我还不懂 还望赐教

解决方案 »

  1.   

    取像素点就是这样取的,也没必要用线程去实现。毕竟才256×256.
    不过,后面转成字符串值倒可以改下。
    char m_clrText[16];
    sprintf(m_clrText, "%02x%02x%02x00 ", GetRValue(clr), GetGValue(clr), GetBValue(clr));
      

  2.   

    直接用new分配一大块内存,在这块内存里,用memcpy拷贝累加字符串。
    字符串全部累加完毕后,把内存赋值给一个CString对象。
    删除内存。
      

  3.   

    直接用GetDIBits可以取到相关的值到一个缓冲区中去。
      

  4.   

    CString 的加法是动态分配内存,效率很低
    既然对于内存的需要明确,可以使用字符缓存区处理,如
    char *psz = new char[cxDIB*cyDIB*12+1];
    char *p=psz;
        for(i = 0; i < cxDIB; i++)
        {
            for(j = 0; j <cyDIB; j++)
            {
                clr = ::GetPixel(hDC,i,j);
    sprintf(p,"%02x %02x %02x 00 ",GetRValue(clr),GetGValue(clr),GetBValue(clr));
    p += 12;
            }
        }使用完psz后...
        delete psz;比较一下与CString用时的差异
      

  5.   

    warroom的方法效率高多了,又长知识了 不过假死还是会存在 只要我再取数据的时候随意点击对话框 就会死掉 呼~·再试试其他的 先谢过
      

  6.   

    之前获取串口数据就是这样的 可能先入为主还是知识链儿有断点 多多指教 by the way  你的头像 很有喜感
      

  7.   


    我回来了 --!好累,这个我用了 和上面 warroom 方法差不多 优于他的,可是最终我要的还是要存入CString m_strRGB中的 因为我要把像素的RGB值存入到二进制文件里(这也是我的骨头 硬啃中)总要把所有数放到一个变量里 所以 用 m_strRGB += p;在所难免(p+=12我没用) 不知道 您还有什么更好的建议没~~谢过
      

  8.   


    可以直接保存图片的buf到文件,按你现在的做法意义不大,将来用也不好用图像处理最好是对整块内存操作,想办法往上靠
      

  9.   

    可是事实上确实假死了--!可能是CString 功能强大 而且操作符也重载了就耗费资源吧~·参考前几位的回答吧 我也半瓶醋
      

  10.   

    m_clrText.Format中CString中Format的效率很低的,不要用这个,用
    sprintf(m_clrText, "%02x%02x%02x00 ", GetRValue(clr), GetGValue(clr), GetBValue(clr));
      

  11.   


    哦,那不要用CString,用BYTE做加减操作,位操作更好
    找找opencv之类的库,有没有现成的矩阵转换,那个效率最快,用的算法和我们平时用的不一样,是优化过的