从打开的一副图象中读取灰度数据???
从打开的一副图象中读取灰度数据?
涉及到那些函数,有没有从设备内存环境中把数据直接读到数组中的函数??
问题点数:20、回复次数:1Top
1 楼Tranum(万漏阁主人)回复于 2002-05-20 20:21:09 得分 20
首先声明:我没太看懂你的意思 (1)如果是一个图像文件的话,既然打开了为何不知道如何读数据(如果不知道文件结构的话,我会在最后列出).(2)你说要从设备内春环境中直接读到数组中,你是咋把他弄到设备内春环境中的,糊涂了.
然后,下面是我的做法(打开文件-->读数据):
假设有图片a.bmp,256色灰度
unsigned char head[1078];//bmp图像文件头最大也就震大了
unsigned char* pfilehead=head;
unsigned char* pinfohead=head+sizeof(BITMAPFILEHEADER);
unsigned char* pImg;
CFile cfile;
cfile.Open("a.bmp",CFile::modeRead,NULL);//打开文件
if(cfile.GetLengh()>54)//不可以比这小
{
cfile.Read(pfilehead,sizeof(BITMAPFILEHEADER));//读取结构BITMAPFILEHEADER
cfile.Read(pinfohead,sizeof(BITMAPINFOHEADER));//读取结构BITMAPINFOHEADER
if(0x424d!=*((WORD*)head))
{
AfxMessageBox("is not a pic");//不是图片
}
else//是图片
{
int big=((BITMAPFILEHEADER*)pinfohead)->biWidth * ((BITMAPFILEHEADER*)pinfohead)->biHeight;//宽*高=得到数据大小
pImg=new unsigned char[big];//分配内存
cfile.Seek(1078,CFile::begin);//256色灰度图像数据开始的位置
cfile.Read(pImg,bigf);//读
cfile.Close();//关闭
////////////////////////////////////////////////////////////////
///////////////////////好了,读到pImg里了,别忘了释放内存/////////
////////////////////////////////////////////////////////////////
}
}
else
{
AfxMessageBox("is not a pic");//不是图片
}
一些说明:
在pImg中(bmp文件中)图像数据是以行为单位连秀存放的(从下到上从左到右),顺序是最后一行, 倒数第二行,倒数第三行......第二行,第一行.
每一行都4字节取齐,不足补0(实际分辨率不变),填入的数据仅做占位的作用.
bmp图像结构为:BITMAPFILEHEADER,BITMAPINFOHEADER,Palette(调色板),图像数据,四个部分.第一部分为14字节,第二部分40字节,调色板大小不固定,最后部分为宽*高*一个像素的字节数.
上面程序仅针对256色灰度图像
下面是几个结构:
typedef struct tagBITMAPINFOHEADER{ // bmih
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPlanes;
WORD biBitCount
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
} BITMAPINFOHEADER;
typedef struct tagBITMAPFILEHEADER { // bmfh
WORD bfType;
DWORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;
} BITMAPFILEHEADER;
typedef struct tagRGBQUAD { // rgbq
BYTE rgbBlue;
BYTE rgbGreen;
BYTE rgbRed;
BYTE rgbReserved;
} RGBQUAD; //调色版
最后,只有256色灰度图像数据每一字节代表一个灰度值,其余的都是一个索引值,要根据索引查调色版,然后根据RGB换算成灰度,24位色图像没有调色版,54字节的文件头后面直接是数据,三字节一个像素,顺序BGR,也需要换算出灰度
其余的,我还不明白你是啥意思呢,等我知道以上不是废话而且你需要再说吧Top




