api实现24位图像获取

hiloye 2003-07-31 10:18:09
本人想要在win32 dll工程中,获取一幅24位的bmp位图照片,并且对图片中的每个象素进行处理——也就是说不能用MFC,只能用API编程实现。哪位高手可以给点实质性的建议,不胜感激! 如能提供源代码那就更好!
...全文
53 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
e_feeling 2003-08-06
  • 打赏
  • 举报
回复
知道了宽度是4字节的倍数,换行读取没问题的!
red-fly 2003-08-05
  • 打赏
  • 举报
回复
噢,发现错误,上边的程序中,在for循环里边,三句后后边分别少了一个“)”,加上即可
red-fly 2003-08-05
  • 打赏
  • 举报
回复
这样:

//首先,这段程序的前提是,你的图像必需是bmp而且是24位的,所以程序中不再判断
CFile myfile;
myfile.Open(filename,CFile::modeRead); //打开文件
LPSTR lpSrc;
int iLen=sizeof(BITMAPFILEHEADER);
lpSrc=(LPSTR)malloc(iLen);
myfile.Read(lpSrc,iLen); //读文件头
LPBITMAPFILEHEADER pbhdr;
pbhdr=(LPBITMAPFILEHEADER)lpSrc;
int ifilelen=pbhdr->bfSize; //文件长度
free(lpSrc);
lpSrc=NULL;
int iilen=sizeof(BITMAPINFOHEADER);
lpSrc=(LPSTR)malloc(iilen);
myfile.Read(lpSrc,iilen);
LPBITMAPINFOHEADER pihdr;
pihdr=(LPBITMAPINFOHEADER)lpSrc;
int iwidth=lpSrc->biWidth;
int iheight=lpSRc->biHeight;
free(lpSrc);
lpSrc=NULL;
lpSrc=(LPSTR)malloc(ifilelen-iLen-iilen);
myfile.ReadHuge(lpSrc,ifilelen-iLen-iilen); //图像内容
int iLineBytes=(iwidth*24+31)/32*4;
//注意,像素的排列是从左到右,从下到上的
for(int y=iheight;y>0;y--)
{
for(int x=0;x<iwidth;x--)
{
unsigned char ir,ib,ig;
ir=*((unsigned char*)lpSrc+(iHeight-y)*iLineBytes+x*3+2; //红色分量
ig=*((unsigned char*)lpSrc+(iHeight-y)*iLineBytes+x*3+1; //绿色分量
ib=*((unsigned char*)lpSrc+(iHeight-y)*iLineBytes+x*3+0; //蓝色分量

//对此象素的三种颜色值分别处理
... ...
}
}

随手写的,也许有错
寻开心 2003-08-04
  • 打赏
  • 举报
回复
http://www2.ccw.com.cn/tips/9905/051406_03.asp
到这里下载里面的全文吧
hiloye 2003-08-03
  • 打赏
  • 举报
回复
To:realizedream(-273.15℃) ,你能再讲得详细一点吗?我在读取24bmp的时候就是这么读的,好像没有出现什么异常。
realizedream 2003-08-01
  • 打赏
  • 举报
回复
e_feeling(点击无限)

24位的BMP图像中的一个像素占用3个字节,从开始部分依次按顺序读取3个字节的值就是每个像素的值.

不会告诉我,你真用这样的方法来处理图像的吧????!!!!
bitmap中行与行之间是有间隔的,并不是像你说的那样连续的
BlueSky2008 2003-08-01
  • 打赏
  • 举报
回复
MFC不过是API的封装,只要MFC能实现的,API都能实现,下面是我以前写的一个函数:

int MyOpenFile(HWND hWnd, char* pData, unsigned long cbData){
OPENFILENAME ofn;
HANDLE hfile;
char szFilter[] = {"DNA Files(*.dna)\0*.dna\0AllFiles\0*.*\0"};
char szDirName[MAX_PATH] = " ";
char szFile[MAX_PATH] = " ";
char szFileTitle[MAX_PATH] = " ";
unsigned long num;

ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = hWnd;
ofn.hInstance = hInst;
ofn.lpstrCustomFilter = (LPSTR)NULL;
ofn.nMaxCustFilter = 0L;
ofn.nFilterIndex = 1;
ofn.lpstrFile = szFile;
ofn.nMaxFile = sizeof(szFile);
ofn.lpstrFileTitle = szFileTitle;
ofn.nMaxFileTitle = sizeof(szFileTitle);
ofn.lpstrInitialDir = NULL;
ofn.nFileOffset = 0;
ofn.nFileExtension = 0;
ofn.lpstrDefExt = NULL;
ofn.lCustData = 0;
ofn.Flags = OFN_OVERWRITEPROMPT;
ofn.lpstrTitle = "读入DNA数据";
ofn.lpstrFilter = szFilter;

if(GetOpenFileName(&ofn)){
hfile=CreateFile(ofn.lpstrFile,GENERIC_READ,
FILE_SHARE_READ,NULL,OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,0);

if(hfile==INVALID_HANDLE_VALUE){
MessageBox(0,"File open error","Load file",
MB_OK|MB_ICONEXCLAMATION);
return 0;
}

ReadFile(hfile,pData,cbData,&num,0);
CloseHandle(hfile);
if(cbData == num)return 1;
}//if(openfilename)
return 0;
}
寻开心 2003-08-01
  • 打赏
  • 举报
回复
读取文件对于24位的来说相对比较简单,主要是要明白BMP文件的磁盘格式
其实在MSDN当中都有明确的说明的
大致处理方式就是
CFile file;
file.Open(.....)
BITMAPFILEHEADER head;
//BITMAPINFOHEADER info;
file.Read(head,sizeof(BITMAPFILEHEADER));
file.Seek(head.bfOffBits,0)
unsigned char *pData;
DWORD dwData=file.getlength()-head.bfOffBits;
pData=(unsigned char *)malloc(dwData+20);
file.Read(pData,dwData);
file.Close()
////
就不写完整的代码啦


模仿CFileDialog功能的代码很多,前面已经有人给出了。
你还可以在www.codeproject.com 上面的file&folder下面找到其他类似MFC的文件打开类的例子。
寻开心 2003-07-31
  • 打赏
  • 举报
回复
前面给的帖子里面有如何从HBITMAP到磁盘文件的实现代码。
处理的时候注意,位图文件的大小在宽度上必须是4的倍数。
寻开心 2003-07-31
  • 打赏
  • 举报
回复
24位BMP属于图像当中比较好处理的,因为每个象素占据3个字节。
你的问题是把它输出到BMP文件吗?
有这样的例子http://expert.csdn.net/Expert/topic/2025/2025742.xml?temp=.9139673
BlueSky2008 2003-07-31
  • 打赏
  • 举报
回复
LoadImage()加载位图,
GetBitmapBits得到图像数据。
自己处理...
SetBitmapBits设置图像数据。
e_feeling 2003-07-31
  • 打赏
  • 举报
回复
三个字节是蓝,绿,红的值.
e_feeling 2003-07-31
  • 打赏
  • 举报
回复
24位的BMP图像中的一个像素占用3个字节,从开始部分依次按顺序读取3个字节的值就是每个像素的值.
hiloye 2003-07-31
  • 打赏
  • 举报
回复
谢谢各位。 to happy__888([顾问团]寻开心):我是想读取一幅24位的bmp图。其功能相当于用MFC的CFileDialog类,从弹出的框中选择某一幅24位图。

4,446

社区成员

发帖
与我相关
我的任务
社区描述
图形图像/机器视觉
社区管理员
  • 机器视觉
  • 迪菲赫尔曼
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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