求教:我是超级菜鸟,想问问各位高手,用VC++6.0处理图像的时候建立什么...
发布网友
发布时间:2024-10-24 16:22
我来回答
共4个回答
热心网友
时间:2024-10-24 21:13
原则上任何cpp文件都可以处理图像的,只不过看你把打开图像文件的句柄放在什么位置上
例如:文件-〉新建-〉工程-〉MFC AppWizard.EXE-〉起个工程名字,我选择aaa,然后点下一步-〉选择单文档或者双重文档都可以,看你的需求,接下来同样如此,直接选择默认也可。然后会自动建立几个文件,比如CAaaView类,CAaaApp类,CAaaDoc类,CMainframe类等等,主要看你头几步的选择,然后会出现源文件有aaa.cpp, aaa.rc, aaaDoc.cpp, aaaView.cpp, MainFrm.cpp, StdAfx.cpp,对应的头文件就是上面的名字,后缀是.h的,不过aaa.rc对应的是Resource.h文件,这个存储的是菜单。好了完成这一步,许多代码都自动填充进相应的文件了。
aaa.cpp一般来讲,程序运行的时候,就是先运行它,然后完成各类窗体的初始化,不过代码一般不放在这里。
把打开图像的过程放在aaaDoc.cpp中的CAaaDoc::OnNewDocument()中(这个是自动定义好的)
CFile file; //CFile类
CFileException fe;
// 打开文件
if (!file.Open(lpszPathName, CFile::modeRead | CFile::shareDenyWrite, &fe))
{
// 失败
ReportSaveLoadException(lpszPathName, &fe,
FALSE, AFX_IDP_FAILED_TO_OPEN_DOC);
// 返回FALSE
return FALSE;
}
BITMAPFILEHEADER bmfHeader; //BMP文件头
DWORD dwBitsSize;
HDIB hDIB;
LPSTR pDIB;
// 获取DIB(文件)长度(字节)
dwBitsSize = file.GetLength();
// 尝试读取DIB文件头
if (file.Read((LPSTR)&bmfHeader, sizeof(bmfHeader)) != sizeof(bmfHeader))
{
// 大小不对,返回NULL。
return NULL;
}
// 判断是否是DIB对象,检查头两个字节是否是"BM"
if (bmfHeader.bfType != DIB_HEADER_MARKER)
{
// 非DIB对象,返回NULL。
return NULL;
}
// 为DIB分配内存,这里hDIB就是打开BMP文件并读取数据到内存中的句柄了,任何修改不通过它是不行的
hDIB = (HDIB) ::GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, dwBitsSize);
if (hDIB == 0)
{
// 内存分配失败,返回NULL。
return NULL;
}
// 锁定 pDIB是返回该句柄的指针
pDIB = (LPSTR) ::GlobalLock((HGLOBAL) hDIB);
// 读象素
if (file.ReadHuge(pDIB, dwBitsSize - sizeof(BITMAPFILEHEADER)) !=
dwBitsSize - sizeof(BITMAPFILEHEADER) )
{
// 大小不对。
// 解除锁定
::GlobalUnlock((HGLOBAL) hDIB);
// 释放内存
::GlobalFree((HGLOBAL) hDIB);
// 返回NULL。
return NULL;
}
// 解除锁定
::GlobalUnlock((HGLOBAL) hDIB);
// 返回DIB句柄
return hDIB;
就是这些语句,不过,这些读取DIB位图有专门的一个函数库,你可以直接添加这些文件就行了
有 DIBAPI.CPP DIBAPI.h你自己上网上搜索就有下载。不是源代码,切误复制运行。
上面把图像读到内存中,返回句柄hDIB,然后呢你需要在
aaaView::OnDraw(CDC* pDC) 里面继续添加代码,好把内存中的图像显示出来,这里也需要用到DIBAPI.CPP里面的函数,要不自己编,可是太麻烦了。我给你列出这些函数吧,自己看看就知道了。
// ************************************************************************
// 文件名:dibapi.cpp
//
// DIB(Independent Bitmap) API函数库:
//
// PaintDIB() - 绘制DIB对象
// CreateDIBPalette() - 创建DIB对象调色板
// FindDIBBits() - 返回DIB图像象素起始位置
// DIBWidth() - 返回DIB宽度
// DIBHeight() - 返回DIB高度
// PaletteSize() - 返回DIB调色板大小
// DIBNumColors() - 计算DIB调色板颜色数目
// CopyHandle() - 拷贝内存块
//
// SaveDIB() - 将DIB保存到指定文件中
// ReadDIBFile() - 重指定文件中读取DIB对象
//
// DIBToPCX256() - 将指定的256色DIB对象保存为256色PCX文件
// ReadPCX256() - 读取256色PCX文件
//
// ************************************************************************
热心网友
时间:2024-10-24 21:13
如果是MFC的话,从下方选择第二个标签,单击工程点右键选择impor然后t选择图片,不过必须图片是bmp格式的,
热心网友
时间:2024-10-24 21:15
不知道。
热心网友
时间:2024-10-24 21:17
我有一些图像处理的代码 发到你的邮箱了。