`
kanwoerzi
  • 浏览: 1642971 次
文章分类
社区版块
存档分类
最新评论

VC6.0图像处理1--浏览图片

 
阅读更多


点击打开链接源码下载:http://download.csdn.net/detail/renshengrumenglibing/3875522


//显示函数参考了王占全老师的VC图像处理与工程案例,其余的只是参考了一下算法,均为自己编写

一 添加如下public变量:

public:
BITMAPINFOHEADER bi; //信息头
RGBQUAD* quad; //调色板
BYTE* lpBuf; //图像数据
BITMAPINFO* pbi;
int flag; //标志表示是否打开了bmp文件
int numQuad; //调色板数目
BYTE* lpshowbuf; //用于显示的图像数据
int zoomfactor; //缩放比率

二 添加菜单以及处理函数

void CBMPViewerDoc::OnFileOpen()
{
// TODO: Add your command handler code here
LPCTSTR lpszFilter="BMP Files(*.bmp)|*.bmp|任何文件|*.*||";
CFileDialog dlg1(TRUE,lpszFilter,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,lpszFilter,NULL);
CString filename;


BITMAPFILEHEADER bf;


//打开文件对话框
if(dlg1.DoModal()==IDOK)
{
filename=dlg1.GetPathName();
if(file.Open(filename,CFile::modeRead|CFile::shareDenyNone,NULL)==0)
{
//读取文件失败
AfxMessageBox("无法打开文件!",MB_OK,0);
return;
}
//读取文件头
file.Read(&bf,sizeof(bf));
//判断是否是BMP文件
if(bf.bfType!=0x4d42)//'BM'
{
AfxMessageBox("非BMP文件!",MB_OK,0);
return;
}
//判断文件是否损坏
if(file.GetLength()!=bf.bfSize)
{
AfxMessageBox("文件已损坏,请检查!",MB_OK,0);
return;
}


//读文件信息头
file.Read(&bi,sizeof(bi));

//计算调色板数目
numQuad=0;
if(bi.biBitCount<24)
{
numQuad=1<<bi.biBitCount;
}

//为图像信息pbi申请空间
pbi=(BITMAPINFO*)HeapAlloc(GetProcessHeap(),0,sizeof(BITMAPINFOHEADER)+numQuad*sizeof(RGBQUAD));
memcpy(pbi,&bi,sizeof(bi));
quad=(RGBQUAD*)((BYTE*)pbi+sizeof(BITMAPINFOHEADER));

//读取调色板
if(numQuad!=0)
{
file.Read(quad,sizeof(RGBQUAD)*numQuad);
}

//为图像数据申请空间
bi.biSizeImage=bf.bfSize-bf.bfOffBits;
lpBuf=(BYTE*)HeapAlloc(GetProcessHeap(),0,bi.biSizeImage);
//读取图像数据
file.Read(lpBuf,bi.biSizeImage);

//图像读取完毕,关闭文件,设置标志
file.Close();
flag=1;
zoomfactor=1;
lpshowbuf=NULL;
PrepareShowdata(); //进行相关的运算,主要是算出SetDIBitsToDevice()所需要的各个参数
UpdateAllViews(NULL,0,NULL);
}
}

三添加PrepareShowdata()函数

BOOL CBMPViewerDoc::PrepareShowdata()
{
BYTE** image;
BYTE** originimage;
int i,j;
int linewidth;


if(lpshowbuf!=NULL)
HeapFree(GetProcessHeap(),0,lpshowbuf);
if(zoomfactor>=1)
{//放大
pbi->bmiHeader.biHeight=bi.biHeight*zoomfactor;
pbi->bmiHeader.biWidth=bi.biWidth*zoomfactor;

//每行四字节补齐,计算每行字节数:
linewidth=(pbi->bmiHeader.biWidth*pbi->bmiHeader.biBitCount+31)/32*4;

//计算显示图像所需内存大小
pbi->bmiHeader.biSizeImage=linewidth*pbi->bmiHeader.biHeight;

//申请内存
lpshowbuf=(BYTE*)HeapAlloc(GetProcessHeap(),0,pbi->bmiHeader.biSizeImage);

//生成对lpshowbuf的二维数组索引:
image=new BYTE*[pbi->bmiHeader.biHeight];
for(i=0;i<pbi->bmiHeader.biHeight;i++)
image[i]=lpshowbuf+i*linewidth;

originimage=new BYTE*[bi.biHeight];
for(i=0;i<bi.biHeight;i++)
originimage[i]=lpBuf+i*bi.biSizeImage/bi.biHeight;


//赋值
if(bi.biBitCount<24)
{
for(i=0;i<pbi->bmiHeader.biHeight;i++)
for(j=0;j<linewidth;j++)
image[i][j]=originimage[i/zoomfactor][j/zoomfactor];
}
else if(bi.biBitCount==24)
{//24位真彩色
for(i=0;i<pbi->bmiHeader.biHeight;i++)
for(j=0;j<pbi->bmiHeader.biWidth;j++)
{
image[i][j*3]=originimage[i/zoomfactor][(j/zoomfactor)*3];
image[i][j*3+1]=originimage[i/zoomfactor][(j/zoomfactor)*3+1];
image[i][j*3+2]=originimage[i/zoomfactor][(j/zoomfactor)*3+2];
}
}
else
{//32位色
for(i=0;i<pbi->bmiHeader.biHeight;i++)
for(j=0;j<pbi->bmiHeader.biWidth;j++)
{
image[i][j*4]=originimage[i/zoomfactor][(j/zoomfactor)*4];
image[i][j*4+1]=originimage[i/zoomfactor][(j/zoomfactor)*4+1];
image[i][j*4+2]=originimage[i/zoomfactor][(j/zoomfactor)*4+2];
image[i][j*4+3]=originimage[i/zoomfactor][(j/zoomfactor)*4+3];
}
}
}
else
{//缩小
pbi->bmiHeader.biHeight=bi.biHeight/(-zoomfactor);
pbi->bmiHeader.biWidth=bi.biWidth/(-zoomfactor);

//每行四字节补齐,计算每行字节数:
linewidth=(pbi->bmiHeader.biWidth*pbi->bmiHeader.biBitCount+31)/32*4;

//计算显示图像所需内存大小
pbi->bmiHeader.biSizeImage=linewidth*pbi->bmiHeader.biHeight;

//申请内存
lpshowbuf=(BYTE*)HeapAlloc(GetProcessHeap(),0,pbi->bmiHeader.biSizeImage);

//生成对lpshowbuf的二维数组索引:
image=new BYTE*[pbi->bmiHeader.biHeight];
for(i=0;i<pbi->bmiHeader.biHeight;i++)
image[i]=lpshowbuf+i*linewidth;

originimage=new BYTE*[bi.biHeight];
for(i=0;i<bi.biHeight;i++)
originimage[i]=lpBuf+i*bi.biSizeImage/bi.biHeight;


//赋值
if(bi.biBitCount<24)
{
for(i=0;i<pbi->bmiHeader.biHeight;i++)
for(j=0;j<linewidth;j++)
image[i][j]=originimage[i*(-zoomfactor)][j*(-zoomfactor)];
}
else if(bi.biBitCount==24)
{//24位真彩色
for(i=0;i<pbi->bmiHeader.biHeight;i++)
for(j=0;j<pbi->bmiHeader.biWidth;j++)
{
image[i][j*3]=originimage[i*(-zoomfactor)][(j*(-zoomfactor))*3];
image[i][j*3+1]=originimage[i*(-zoomfactor)][(j*(-zoomfactor))*3+1];
image[i][j*3+2]=originimage[i*(-zoomfactor)][(j*(-zoomfactor))*3+2];
}
}
else
{//32位色
for(i=0;i<pbi->bmiHeader.biHeight;i++)
for(j=0;j<pbi->bmiHeader.biWidth;j++)
{
image[i][j*4]=originimage[i*(-zoomfactor)][(j*(-zoomfactor))*4];
image[i][j*4+1]=originimage[i*(-zoomfactor)][(j*(-zoomfactor))*4+1];
image[i][j*4+2]=originimage[i*(-zoomfactor)][(j*(-zoomfactor))*4+2];
image[i][j*4+3]=originimage[i*(-zoomfactor)][(j*(-zoomfactor))*4+3];
}
}


}
return TRUE;
}

四 在View类中显示图片

//在OnPaint()编写

void CBMPViewerView::OnPaint()
{
CPaintDC dc(this); // device context for painting

// TODO: Add your message handler code here
//得到文档指针
CBMPViewerDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);


//是否已打开某个BMP文件
if(pDoc->flag==1)
{
//指定是显示的颜色
SetDIBitsToDevice(dc.m_hDC,0,0,pDoc->pbi->bmiHeader.biWidth,
pDoc->pbi->bmiHeader.biHeight,0,0,0,
pDoc->pbi->bmiHeader.biHeight,pDoc->lpBuf,
pDoc->pbi,DIB_RGB_COLORS);
}
// Do not call CView::OnPaint() for painting messages
}

//未完待续

分享到:
评论

相关推荐

    图像处理系统VC++6.0+GDI+实现

    图像处理系统(VC++6.0+GDI+) 包括:(图像旋转,图像缩放,图像水印效果,PSD文件浏览,照片版式处理)模块

    基于VC++平台简单数字图像处理界面设计

    该数字图像处理界面是基于Microsoft Visual C++ 6.0 MFC多文档编程的图像处理界面,实现.bmp格式图像的浏览与编辑,导入和导出,图像特效显示,边缘检测,旋转和翻转图片,图片增强优化,以及打印输出图片。...

    vc开发经典模式与实例 源码

     5-1-1 图像处理系统用例分析  5-1-2 图像处理系统总体框架结构分析  5-2 系统设计  5-2-1 用例实现  5-2-2 总体框架和界面设计  5-2-3 数据存储设计  5-2-4 精化设计模型  5-3 图像处理系统的...

    VC开发经典模式与实例.rar

     5-1-1 图像处理系统用例分析  5-1-2 图像处理系统总体框架结构分析  5-2 系统设计  5-2-1 用例实现  5-2-2 总体框架和界面设计  5-2-3 数据存储设计  5-2-4 精化设计模型  5-3 图像处理系统的...

    《Visual C++数字图像处理开发入门与编程实践》源码

    第1章 Visual C++与数字图像处理 1 1.1 数字图像处理概述 2 1.1.1 图像与数字图像 2 1.1.2 数字图像处理研究的内容 4 1.1.3 数字图像处理的应用 6 1.2 Visual C++概述 8 1.2.1 C++语言简介 8 1.2.2 Visual C++简介 ...

    若干vc代码1352.rar

    2012-06-13 13:30 1,124,527 图像模式识别--VC++技术实现.zip 2012-06-13 13:07 2,173,078 14123166.bmp 2012-06-13 13:47 2,189,856 27个全屏触摸屏版JAVA游戏打包下载.rar 2012-06-13 13:40 2,410,554 [瞬间放松法...

    易语言程序免安装版下载

     增加静态编译功能,支持挂接第三方链接器(比如VC6中的link.exe)。  静态编译后的易语言可执行程序(exe)和动态链接库(dll),运行时不再依赖任何支持库文件,文件尺寸更小(相对以前的独立编译),PE结构更合理...

    vc++ 开发实例源码包

    处理Jpeg图片。 KeyHook 键盘钩子,截获键盘信息。 Kugou7+UI 界面设计。学习界面的好实例,强烈推荐。 自绘button 如题。 自绘MENU 如题。 自绘tab 如题。 自绘Tree 如题。 自绘按钮button源代码 如题。 自...

    编程技巧(全部工程源代码,物超所值)

    VC++6.0下的图像处理及在多文档和无模态对话框中的实时显示;VC++6.0多线程技术在端口扫描程序中的应用;VC++6.0多线程技术在端口扫描程序中的应用 VC++6.0多线程技术在端口扫描程序中的应用 让程序防病毒 ...

    vc++ 应用源码包_6

    利用Delphi的代码在VC中显示JPG图片,不使用动态连接库。 Mail_Report.zip 一个邮件报告程序。 SrcFirstProg.zip 解释了最基本的MFC程序流程。 tabcontrol_demo.zip tabcontrol_src.zip 自定义的标签控件对话框...

    vc++ 应用源码包_1

    利用Delphi的代码在VC中显示JPG图片,不使用动态连接库。 Mail_Report.zip 一个邮件报告程序。 SrcFirstProg.zip 解释了最基本的MFC程序流程。 tabcontrol_demo.zip tabcontrol_src.zip 自定义的标签控件对话框...

    vc++ 应用源码包_2

    利用Delphi的代码在VC中显示JPG图片,不使用动态连接库。 Mail_Report.zip 一个邮件报告程序。 SrcFirstProg.zip 解释了最基本的MFC程序流程。 tabcontrol_demo.zip tabcontrol_src.zip 自定义的标签控件对话框...

    vc++ 应用源码包_3

    利用Delphi的代码在VC中显示JPG图片,不使用动态连接库。 Mail_Report.zip 一个邮件报告程序。 SrcFirstProg.zip 解释了最基本的MFC程序流程。 tabcontrol_demo.zip tabcontrol_src.zip 自定义的标签控件对话框...

    vc++ 应用源码包_5

    利用Delphi的代码在VC中显示JPG图片,不使用动态连接库。 Mail_Report.zip 一个邮件报告程序。 SrcFirstProg.zip 解释了最基本的MFC程序流程。 tabcontrol_demo.zip tabcontrol_src.zip 自定义的标签控件对话框...

Global site tag (gtag.js) - Google Analytics