最近弄个取制定图片的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) 操作起来程序就会假死,请问我该怎么处理,多线程的东西我还不懂 还望赐教
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) 操作起来程序就会假死,请问我该怎么处理,多线程的东西我还不懂 还望赐教
不过,后面转成字符串值倒可以改下。
char m_clrText[16];
sprintf(m_clrText, "%02x%02x%02x00 ", GetRValue(clr), GetGValue(clr), GetBValue(clr));
字符串全部累加完毕后,把内存赋值给一个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用时的差异
我回来了 --!好累,这个我用了 和上面 warroom 方法差不多 优于他的,可是最终我要的还是要存入CString m_strRGB中的 因为我要把像素的RGB值存入到二进制文件里(这也是我的骨头 硬啃中)总要把所有数放到一个变量里 所以 用 m_strRGB += p;在所难免(p+=12我没用) 不知道 您还有什么更好的建议没~~谢过
可以直接保存图片的buf到文件,按你现在的做法意义不大,将来用也不好用图像处理最好是对整块内存操作,想办法往上靠
sprintf(m_clrText, "%02x%02x%02x00 ", GetRValue(clr), GetGValue(clr), GetBValue(clr));
哦,那不要用CString,用BYTE做加减操作,位操作更好
找找opencv之类的库,有没有现成的矩阵转换,那个效率最快,用的算法和我们平时用的不一样,是优化过的