CImage在MFC中使用的棘手问题?

xiaoyaoziqing 2013-05-01 05:11:13
void Csmoothorsharp::FilterImg(int* temp){

int nW=img.GetWidth()-1;
int nH=img.GetHeight()-1;

byte *pRealData;
pRealData=(byte*)img.GetBits();
int pit=img.GetPitch();
int bitCount=img.GetBPP()/8;


for (int i=1;i<nH;i++)
{
for (int j=1;j<nW;j++)
{
int Rval=0,Gval=0,Bval=0,indx=0;
for ( int row=-1;row<=1;row++)
{
for (int col=-1;col<=1;col++)
{
int xxx=(int)(int)(*(pRealData));//在这个地方会发生访问0xxx地址的错误,可能是指针越界,但是pRealData是有值的。求解!!!
Bval+=((int)(int)(*(pRealData+pit*(i+row)+(j+col)*bitCount))) *temp[indx];
Gval=((int)(int)(*(pRealData+pit*(i+row)+(j+col)*bitCount+1)))*temp[indx];
Rval=((int)(int)(*(pRealData+pit*(i+row)+(j+col)*bitCount+2)))*temp[indx];
indx++;
}
}
//template work is over,You need get the center point pixel.
Rval=(int)(Rval*cval);
if (Rval>255)
Rval=255;
else if(Rval<0)
Rval=0;

Gval=(int)(Gval*cval);
if (Gval>255)
Gval=255;
else if(Gval<0)
Gval=0;

Bval=(int)(Bval*cval);
if (Bval>255)
Bval=255;
else if (Bval<0)
Bval=0;

//ok,write the new pixel into the pic.
*(pRealData+pit*(i-1)+(j-1)*bitCount)=Bval;
*(pRealData+pit*(i-1)+(j-1)*bitCount+1)=Gval;
*(pRealData+pit*(i-1)+(j-1)*bitCount+2)=Rval;
}
}
...全文
231 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
KPLives 2013-11-17
  • 打赏
  • 举报
回复
LZ,你好!不知道您的问题解决了吗?我现在正遇到您这个问题而一筹莫展,不知能否告知一下您的解决办法?谢谢~^_^
schlafenhamster 2013-05-02
  • 打赏
  • 举报
回复
int xxx=*(int*)pRealData; 你能 保证 一个pxl 是4个字节吗 ?(是不是 24位 位图 ?)
xiaoyaoziqing 2013-05-02
  • 打赏
  • 举报
回复
注,上图的this中的img的首地址是发生访问冲突的0x0131000,也就是说首地址有取到。但是为什么不能通过它来访问数据呢?
xiaoyaoziqing 2013-05-02
  • 打赏
  • 举报
回复
引用 2 楼 schlafenhamster 的回复:
int xxx=(int)(int)(*(pRealData));//?????
不就是 在pRealData 取一个 整数 吗?
int xxx=*(int*)pRealData;

你好,我是想通过pRealdata这个img的首地址指针获取img的像素数据,但是到读取的时候,就抱如下错误,求解。。。。。。
xiaoyaoziqing 2013-05-02
  • 打赏
  • 举报
回复
引用 3 楼 domoever 的回复:
pRealData=(byte*)img.GetBits(); 问题就在这句 GetBits()不是真正的数据区首地址,而是图像左上角第一行的首地址。 现在的图像存储都是从下往上扫描存储的,所以真正的首地址是左下角第一个。 如何判断呢,如果GetPitch()为负,就是从下往上存储。 CIMAGE这个类我大量使用,以下是本人获取图形首地址的代码,可参考 // 得到图像的数据区首地址 by ZL byte* GetRealDataAddress(CImage* pImage) { BYTE *Addr=NULL; if(!pImage->IsNull()) { if(pImage->GetPitch()<0) { //方法1 Addr=(BYTE *)pImage->GetBits()+pImage->GetPitch()*(pImage->GetHeight()-1); //方法2 //FirstAdd=(BYTE *)Image->GetPixelAddress(0,h-1); } else Addr=(BYTE *)pImage->GetBits(); } return Addr; }
你好,你的代码和意思,我明白。我有对pitch的值做像素首地址的定位,大致与你给出的代码相似。但是得到的pRealData时,通过断点显示,这个指针是错误。后面再有这个指针来取数据时就发生错误。但是查看img变量时,发现img的首地址确实是pRealData的值。一直不明白哪里错误?
domoever 2013-05-01
  • 打赏
  • 举报
回复
pRealData=(byte*)img.GetBits(); 问题就在这句 GetBits()不是真正的数据区首地址,而是图像左上角第一行的首地址。 现在的图像存储都是从下往上扫描存储的,所以真正的首地址是左下角第一个。 如何判断呢,如果GetPitch()为负,就是从下往上存储。 CIMAGE这个类我大量使用,以下是本人获取图形首地址的代码,可参考 // 得到图像的数据区首地址 by ZL byte* GetRealDataAddress(CImage* pImage) { BYTE *Addr=NULL; if(!pImage->IsNull()) { if(pImage->GetPitch()<0) { //方法1 Addr=(BYTE *)pImage->GetBits()+pImage->GetPitch()*(pImage->GetHeight()-1); //方法2 //FirstAdd=(BYTE *)Image->GetPixelAddress(0,h-1); } else Addr=(BYTE *)pImage->GetBits(); } return Addr; }
schlafenhamster 2013-05-01
  • 打赏
  • 举报
回复
int xxx=(int)(int)(*(pRealData));//????? 不就是 在pRealData 取一个 整数 吗? int xxx=*(int*)pRealData;
LiuYinChina 2013-05-01
  • 打赏
  • 举报
回复
你在做什么?直接把数据往 CImage 里放不就行了吗?

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧