社区
机器视觉
帖子详情
api实现24位图像获取
hiloye
2003-07-31 10:18:09
本人想要在win32 dll工程中,获取一幅24位的bmp位图照片,并且对图片中的每个象素进行处理——也就是说不能用MFC,只能用API编程实现。哪位高手可以给点实质性的建议,不胜感激! 如能提供源代码那就更好!
...全文
112
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
获取
窗口图片(截图)
//借鉴网上的文章: HBITMAP CopyDCToBitmap(HDC hDC, LPRECT lpRect) { if(!hDC || !lpRect || IsRectEmpty(lpRect)) return NULL; HDC hMemDC; HBITMAP hBitmap, hOldBitmap; int nX, nY, nX2, nY2; int nWid...
C++
实现
24
位
位图
像素数据的BMP文件保存
BMP文件格式最显著的特征是其存储简单直观,它包含图像文件头、图像信息头、颜色表(对于索引颜色模式)和
位图
数据。这些部分按照顺序排列,为不同的图像处理软件提供了足够的信息来准确显示和处理图像。BMP文件有固定的结构,包括文件头、信息头、颜色表和像素数据等部分。我们可以定义结构体来表示这些信息。#pragma pack(push, 1) // 确保结构体成员按照1字节对齐// 假设已经从BMP文件中读取了fileHeader和infoHeader的数据。
VB图像处理,(一)像素的
获取
和输出
一直想自己写一个图像处理的软件。在网络上找各种图像处理方面的技术文章。但是找到的往往不是高深的理论,就是用C++等语言写出来的例程,非常不便。其实很多时候,我想找的只是一种描述,或者是伪代码,既有利于理解,也有利于改写成任何语言的版本。近日,我把自己学到的一些图像处理方面的知识写了一个ImageCast的小程序。把自己所掌握的处理技巧作了一个“包装”,感慨于资料收集的不便和学习VB中的点点
如何在Java应用程序中读取8位,
24
位Microsoft Windows
位图
(精品)
Java 的当前发行版并不正式支持在 Java 应用程序中读取 Microsoft Windows
位图
文件。但别担心,我们有办法解决这个问题!这篇技巧将说明如何完成这一任务 -- 我们首先说明读取 Microsoft Windows 文件格式的基本步骤。 Windows DIB(设备独立的
位图
)文件格式比较简单。与纯
位图
格式不同,DIB 格式保留着用于在内存中存储图像的明确信息。问题是图像格式的
24
位真彩色转换为8位灰度图片(完整代码)
#include <windows.h> #include<iostream> using namespace std; BOOL BMP
24
to8(char *szSourceFile,char *szTargetFile); int main(int argc,char* argv[]) { //调用这个函数直接把
24
位真彩色灰度化 BOOL st...
机器视觉
4,514
社区成员
15,347
社区内容
发帖
与我相关
我的任务
机器视觉
图形图像/机器视觉
复制链接
扫一扫
分享
社区描述
图形图像/机器视觉
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章