基于VC.NET的GDI+图像处理

我们知道,在以往的图像处理中,常常要根据不同图像文件的格式及其数据存储结构在不同格式中进行转换。某个图像文件的显示也是依靠对文件数据结构的剖析,然后读取相关图像数据而实现的。现在,GDI+提供了Image和Bitmap类使我们能轻松容易地处理图像。

概述

GDI+支持大多数流行的图像文件格式,如BMP、GIF、JPEG、TIFF和PNG等。下面先来介绍这些图像文件,然后再说明Image和Bitmap类支持的特性。

1.图像文件格式简介

图像文件是描绘一幅图像的计算机磁盘文件,其文件格式不下数十种。这里仅介绍BMP、GIF、JPEG、TIFF和PNG等图像文件格式。

BMP文件格式

BMP图像文件格式是Microsoft为其Windows环境设置的标准图像格式。一个Windows的BMP位图实际上是一些和显示像素相对应的位阵列,它有两种类型:一种称之为GDI位图,另一种是DIB位图(Device-Independent Bitmap)。GDI位图包含了一种和Windows的GDI模块有关的Windows数据结构,该数据结构是与设备有关的,故此位图又称为DDB位图(Device-Dependent Bitmap)。当用户的程序取得位图数据信息时,其位图显示方式视显示卡而定。由于GDI位图的这种设备依赖性,当位图通过网络传送到另一台PC,很可能就会出现问题。

DIB比GDI位图有很多编程优势,例如它自带颜色信息,从而使调色板管理更加容易。且任何运行Windows的机器都可以处理DIB,并通常以后缀为.BMP的文件形式被保存在磁盘中或作为资源存在于程序的EXE或DLL文件中。

GIF文件格式

图形交换格式(GIF--Graphics Interchange Format)最早由CompuServe公司于1987年6月15日制定的标准,主要用于CompuServe网络图形数据的在线传输、存储。GIF提供了足够的信息并很好地组织了这些信息,使得许多不同的输入输出设备能够方便地交换图像,它支持24位彩色,由一个最多256种颜色的调色板实现,图像的大小最多是64K x 64K个像点。GIF的特点是LZW压缩、多图像和交错屏幕绘图。

JPEG文件格式

国际标准化组织(ISO)和国际电报电话咨询委员会(CCITT)联合成立的"联合照片专家组"JPEG(Joint Photographic Experts Group)经过五年艰苦细致工作后,于1991年3月提出了ISO CD 10918号建议草案:"多灰度静止图像的数字压缩编码"(通常简称为JPEG标准)。这是一个适用于彩色和单色多灰度或连续色调静止数字图像的压缩标准。它包括无损压缩和基于离散余弦变换和Huffman编码的有损压缩两个部分。前者不会产生失真,但压缩比很小;后一种算法进行图像压缩时,信息虽有损失但压缩比可以很大。例如压缩20~40倍时,人眼基本上看不出失真。

JPEG图像文件也是一种像素格式的文件格式,但它比BMP等图像文件要复杂许多。所幸的是,GDI+的Image提供了对JPEG文件格式的支持,使得我们不需要对JPEG格式有太多的了解就能处理该格式的图像。

TIFF文件格式

TIFF(Tagged Image Format File,标志图像文件格式)最早由Aldus公司于1986年推出的,它能对从单色到24位真彩的任何图像都有很好的支持,而且在不同的平台之间的修改和转换是十分容易的。与其它图像文件格式不同的是,TIFF文件中有一个标记信息区用来定义文件存储的图像数据类型、颜色和压缩方法。

PNG文件格式

PNG(Portable Network Graphic,可移植的网络图像)文件格式是由Thomas Boutell、Tom Lane等人提出并设计的,它是为了适应网络数据传输而设计的一种图像文件格式,用于取代格式较为简单、专利限制严格的GIF图像文件格式。而且,这种图像文件格式在某种程度上甚至还可以取代格式比较复杂的TIFF图像文件格式。它的特点主要有:压缩效率通常比GIF要高、提供Alpha通道控制图像的透明度、支持Gamma校正机制用来调整图像的亮度等。

需要说明的是,PNG文件格式支持三种主要的图像类型:真彩色图像、灰度级图像以及颜色索引数据图像。JPEG只支持前两种图像类型,而GIF虽然可以利用灰度调色板补偿图像的灰度级别,但原则上它仅仅支持第三种图像类型。

mage和Bitmap类概述

GDI+的Image类封装了对BMP、GIF、JPEG、PNG、TIFF、WMF(Windows元文件)和EMF(增强WMF)图像文件的调入、格式转换以及简单处理的功能。而Bitmap是从Image类继承的一个图像类,它封装了Windows位图操作的常用功能。例如,Bitmap::SetPixel和Bitmap::GetPixel分别用来对位图进行读写像素操作,从而可以为图像的柔化和锐化处理提供一种可能。

3.DrawImage方法

DrawImage是GDI+的Graphics类显示图像的核心方法,它的重载函数有许多个。常用的一般重载函数有:
程序代码:

Status DrawImage( Image* image, INT x, INT y);
Status DrawImage( Image* image, const Rect& rect);
Status DrawImage( Image* image, const Point* destPoints, INT count);
Status DrawImage( Image* image, INT x, INT y, INT srcx, INT srcy,
INT srcwidth, INT srcheight, Unit srcUnit); 其中,(x,y)用来指定图像image显示的位置,这个位置和image图像的左上角点相对应。rect用来指定被图像填充的矩形区域, destPoints和count分别用来指定一个多边形的顶点和顶点个数。若count为3时,则表示该多边形是一个平行四边形,另一个顶点由系统自动给出。此时,destPoints中的数据依次对应于源图像的左上角、右上角和左下角的顶点坐标。srcx、srcy、srcwidth 和srcheight用来指定要显示的源图像的位置和大小,srcUnit用来指定所使用的单位,默认时使用PageUnitPixel,即用像素作为度量单位。

时间: 2024-08-03 19:53:26

基于VC.NET的GDI+图像处理的相关文章

基于VC.NET的GDI+编程之CImage

我们知道,Visual C++的CBitmap类和静态图片控件的功能是比较弱的,它只能显示出在资源中的图标.位图.光标以及图元文件的内容,而不像VB中的Image控件可以显示出绝大多数的外部图像文件(BMP.GIF.JPEG等).因此,想要在对话框或其他窗口中显示外部图像文件则只能借助于第三方提供的控件或代码.现在,MFC和ATL共享的新类CImage为图像处理提供了许多相应的方法,这使得Visual C++在图像方面的缺憾一去不复返了. CImage类概述 CImage是MFC和ATL共享的新

腾讯开源基于HTML5技术的专业级图像处理引擎 AlloyImage

腾讯开源基于http://www.aliyun.com/zixun/aggregation/33875.html">HTML5技术的专业级图像处理引擎 Alloy Image 发表于16小时前| 次阅读| 来源CSDN| 0 条评论| 作者张红月 腾讯AlloyTeamAlloyImageAlloyPhotoGitHub开源HTML5 摘要:近日,腾讯 Web前端团队AlloyTeam推出了最 新的开源项目:一个基于HTML5技术的专业级图像处理引擎--AlloyImage(简称AI),以

程序-基于VC++实现分形L系统。

问题描述 基于VC++实现分形L系统. 这是一个课程设计,编写一个程序,简单的可以成像变为分形树就好了

基于Hadoop的遥感数字图像处理方法研究

基于Hadoop的遥感数字图像处理方法研究 东北师范大学   周涛 本文基于Hadoop云计算系统,主要利用并行编程框架MapReduce实现遥感数字图像的增强处理以及对增强后图像进行聚类,并与PC串行处理进行比较研究.针对遥感数字图像的整体亮度偏低.目视效果较差的特点,传统的图像增强方法在遥感数字图像上的处理无法达到人眼舒适的目视判读的效果,以及影响后续处理的问题,本文在无损增强方法的基础上进行了改进,使得原始图像的有效图像区域的无效像素点能够参与增强,实验结果表明该方法达到了很好的目视效果.

VC中使用GDI+的配置方法概述_C 语言

本文以Visual C++ 6.0及Visual Studio 2003为例简述了VC中GDI的配置方法,具体操作如下: 一.对于Visual C++ 6.0的用户: 1. 下载GDI+的库.运行GDI+需要一个GdiPlus.dll的文件; 开发GDI+的程序,还需要GdiPlus.lib和GdiPlus*.h文件.这些都可以在微软的网站上下到.(具体搜一下windows sdk就都出来了) 2. 将以上的文件放在你的工程中的一个目录,然后在stdafx.h中包含#include "GdiPl

基于VC++中ATL创建ActiveX控件的探讨

引言 ActiveX控件是微软公司提供的功能强大的程序设计和开发技术,是COM组件开发技术的重 要组成部分.它是OLE的第三个版本,对原先OLE控件的最大扩展是增加了Internet功能,它 不仅可以在支持OLE控件的容器中使用,更可以作为一个Internet控件,直接成为网页的一部 分.另外,ActiveX控件作为一种可重用的组件,相当于一个封装好的代码模块,它是通过其 方法.属性.事件来与应用程序进行通信的,此外,ActiveX控件是与开发语言无关的.用户 在使用控件时不必考虑它是VC还是用

经验贴-基于Vc++开发IIS7以及IIS6的万能筛选器

前段时间,公司打算自行开发能够跨j2ee以及.net的单点登录平台,需要一个无侵入式的工具,来拦截所有经过iis的http请求(.net框架的拦截器不可行,因为它无法拦截asp的请求).最终找到了可以完美实现需求的方案,就是通过iis+isqpi组件的方式,只是这方面的技术资料较少,所以很是费了一番周折才最终完成,在这里给大家做个分享: 一.iis6篇 1)环境:visual studio6,是的,就是这个古老的开发工具,只有这个工具才自带了isapi的模板,因为iis6也足够古老了,它们都是"

基于VC实现的网络监听功能程序实例_C 语言

本文所述VC++网络监听器代码,可以实现监听网络连接所使用的协议.源IP地址.目标IP地址等信息的功能,并且能把数据内容绑定到网格控件中显示.具体功能代码部分如下所示: //线程函数 UINT ThreadFun( LPVOID pParam ) { CSniffAppDlg* pDlg = static_cast<CSniffAppDlg*>(pParam); MSG msg; char buffer[1000],sourceip[32] ,*tempbuf; char *ptemp; BY

基于VC中使用ForceInclude来强制包含stdafx.h的解决方法_C 语言

在使用VC编程中,为了加快编译,vc编译器提供了预编译的功能.即在cpp代码中包含stdafx.h,那么就可以使用到预编译.如下所示: 复制代码 代码如下: #include "stdafx.h"class Demo{public:    Demo(void);    ~Demo(void);}; 注意: #include "stdafx.h" 是自己手动写的,默认是没有的.因此,有时总会出现忘记写这个的事情,这时候编译器就会报一个错误: 复制代码 代码如下: Er