社区
机器视觉
帖子详情
api实现24位图像获取
hiloye
2003-07-31 10:18:09
本人想要在win32 dll工程中,获取一幅24位的bmp位图照片,并且对图片中的每个象素进行处理——也就是说不能用MFC,只能用API编程实现。哪位高手可以给点实质性的建议,不胜感激! 如能提供源代码那就更好!
...全文
98
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位图。
VC
获取
窗口图片(截图)
本文介绍了一种使用Windows
API
实现
屏幕捕获的方法,并提供了将捕获的屏幕内容保存为
24
位或32位BMP图像文件的具体
实现
。通过创建兼容设备上下文和
位图
,利用StretchBlt进行
位图
拉伸复制,最后通过GetDIBits
获取
位图
数据并写入文件。
C++
实现
24
位
位图
像素数据的BMP文件保存
本文详细介绍在C++中将
24
位
位图
像素数据保存为BMP文件的步骤。先阐述BMP文件格式基础、
24
位
位图
颜色通道,接着解析文件头结构及像素存储方法,还讲解C++文件操作和结构体应用,最后通过编程实践展示保存过程,涉及内存对齐、
API
使用等。
VB图像处理,(一)像素的
获取
和输出
作者因网络上图像处理资料不便,编写ImageCast小程序并分享算法。介绍了在VB中快速
获取
和输出图像像素的方法,如使用DIB方法,给出
获取
和输出像素的过程代码,还解释了用到的
API
、数据结构和全局变量,最后给出测试代码,后续将讲图像处理部分。
如何在Java应用程序中读取8位,
24
位Microsoft Windows
位图
(精品)
本文介绍了 Windows DIB 文件格式,由 14 位文件头和 40 位信息头组成。详细说明了
24
位和 8 位子类型的特点,提供了
位图
图像加载方法,该方法不支持压缩
位图
。还给出了 Java 代码示例,读取未压缩的
24
位和 8
位图
像,最后提到可扩展该方法读取其他格式。
24
位真彩色转换为8位灰度图片(完整代码)
本文提供了一段C++代码,用于将
24
位真彩色的BMP图片转换为8位灰度图像。代码首先读取源BMP文件,检查其是否为
24
位BMP,然后进行灰度化处理,并创建新的目标文件保存结果。该过程包括文件读写、内存分配、颜色空间转换等关键步骤。
机器视觉
4,509
社区成员
15,351
社区内容
发帖
与我相关
我的任务
机器视觉
图形图像/机器视觉
复制链接
扫一扫
分享
社区描述
图形图像/机器视觉
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章