help!关于图像文件指针与鼠标所指位置的换算!

gaoxiaofeng 2000-03-06 12:54:00
想要读出鼠标所指的像元点的rgb值,但发现读出的值不是所指像元,
计算如下:
用onmousemove(...)读取鼠标在窗口中的坐标,
换算:n=point.y*bytes_per_line+point.x*3;
其中:bytes_per_line没问题,图像为24bit 位图。

错误在哪?我似乎发现读出的像元与实际所指大概相差60行。
...全文
148 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
minotaurking 2000-03-06
  • 打赏
  • 举报
回复
窗口坐标以左上点为原点,bmp以左下点为原点,所以要用图像的高度减去point.y才是实际的行数!
tonyhan 2000-03-06
  • 打赏
  • 举报
回复
图像行数据有个4字节对其的说法,如果行宽字节数不足的话,需要添加。
因此行数据的大小与实际的行宽度有差距。
gaoxiaofeng 2000-03-06
  • 打赏
  • 举报
回复
我现在发现问题出在指向图像数据的指针上,我做了两个简单的实验:发现各图像的“行”值均不对,列的值都对,而各幅图像在处理时,同一图像所相差的“行”的数目是固定的,而不同图像的相差“行”的数目则不相同。it's very strange.

我在读取图像数据的时候,可能错误在哪呢?程序中的dibbits即图像的指针。定义为:LPSTR *dibbits; BITMAPINFO *dibinfo;

BITMAPINFOHEADER bmheader;
long headpos;
int PaletteSize=0,ret,getbodysize;
/**[9]读取文件指针的位置**/
headpos=file.GetPosition();
/**[10]读取结构文件头**/
ret=file.Read(&bmfileheader,sizeof(BITMAPFILEHEADER));
if((ret!=sizeof(BITMAPFILEHEADER)) and and (bmfileheader.bfType!=0x4d42))
{
AfxMessageBox("不是*.bmp文件");
return FALSE;
}

ret=file.Read(&bmheader,sizeof(BITMAPINFOHEADER));
if(ret!=sizeof(BITMAPINFOHEADER))
return FALSE;
/**[12]计算rgbquad的大小**/
switch(bmheader.biBitCount)
{
case 1:
PaletteSize=2;
break;
case 4:
PaletteSize=16;
break;
case 8:
PaletteSize=256;
break;
}
/**[13]分配一块内存给bitmapinfo使用**/
cbHeaderSize=sizeof(BITMAPINFOHEADER)+PaletteSize*sizeof(RGBQUAD);
DibInfo=(BITMAPINFO*)new char[cbHeaderSize];
DibInfo->bmiHeader=bmheader;


if(PaletteSize)
{/**[14]**/
ret=file.Read(&(DibInfo->bmiColors[0]),PaletteSize*sizeof(RGBQUAD));
if(ret!=int(PaletteSize*sizeof(RGBQUAD)))
{
delete [] DibInfo;
DibInfo=NULL;
return FALSE;
}
}

int bitsperpixel=((!DibInfo)?0:DibInfo->bmiHeader.biBitCount);
//fillup byte//
bytes_per_line=(DibInfo->bmiHeader.biWidth*bitsperpixel+7)/8;
//quad-byte alignment//
bytes_per_line=(bytes_per_line+3)/4*4;

size=bytes_per_line*DibInfo->bmiHeader.biHeight;
getbodysize=bytes_per_line*DibInfo->bmiHeader.biHeight;
DibBits=(LPSTR)new char[getbodysize];

/**[15]把文件指针移到dib图像阵列**/
beg=headpos+bmfileheader.bfOffBits;
// file.Seek(beg,CFile::begin);

ret=file.Read(DibBits,size);
fupf88 2000-03-06
  • 打赏
  • 举报
回复
是否要用DPtoLP( LPSIZE lpSize )先转换成统一坐标(逻辑坐标)?

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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