社区
机器视觉
帖子详情
api实现24位图像获取
hiloye
2003-07-31 10:18:09
本人想要在win32 dll工程中,获取一幅24位的bmp位图照片,并且对图片中的每个象素进行处理——也就是说不能用MFC,只能用API编程实现。哪位高手可以给点实质性的建议,不胜感激! 如能提供源代码那就更好!
...全文
53
14
打赏
收藏
api实现24位图像获取
本人想要在win32 dll工程中,获取一幅24位的bmp位图照片,并且对图片中的每个象素进行处理——也就是说不能用MFC,只能用API编程实现。哪位高手可以给点实质性的建议,不胜感激! 如能提供源代码那就更好!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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位图。
Windows 图像
获取
API
使用方法
WIA
API
集包含用于文件传输的简单
API
,但不包含用于...GetImage
实现
名为 WiaGetImage 的包装函数,它将 SelectDeviceDlg、DeviceDlg 和 idtGetBandedData
API
的功能组合起来以完全将图像
获取
封装在单个函数调用内。
JAVA_
API
1.6文档(中文)
javax.xml.bind.attachment 此包由基于 MIME 的包处理器
实现
,该处理器能够解释并创建基于 MIME 的包格式的已优化的二进制数据。 javax.xml.bind.helpers 仅由 JAXB 提供者用于: 提供某些 javax.xml.bind 接口的...
java
api
最新7.0
javax.xml.bind.attachment 此包由基于 MIME 的包处理器
实现
,该处理器能够解释并创建基于 MIME 的包格式的已的二进制数据。 javax.xml.bind.helpers 仅由 JAXB 提供者用于: 提供某些 javax.xml.bind 接口的部分...
使用FFmpeg采集摄像头图像和麦克风音频
使用FFmpeg
API
采集摄像头图像和麦克风音频,支持图像预览,把图像和音频编码后保存成文件,
实现
视音频同步机制。为更好理解代码,请阅读我博客上相关的一篇文章:...
使用FFMpeg
API
获取
摄像头的图像数据
摄像头图像数据的
获取
,方法有很多,比如可以使用Qt自带的
API
获取
,也可以使用DirectShow、OpenCV、FFMpeg提供的
API
方式
获取
(本质上是通过DirectShow)。本篇文章主要讲述使用FFMpeg
API
获取
摄像头的数据信息。 ...
机器视觉
4,446
社区成员
15,335
社区内容
发帖
与我相关
我的任务
机器视觉
图形图像/机器视觉
复制链接
扫一扫
分享
社区描述
图形图像/机器视觉
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章