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

VB无所不能之二:利用GDI+处理图像格式转换

 
阅读更多
VB无所不能之二:利用GDI+处理图像格式转换
——作者:钟声
我今天想再续写一篇关于VB的有关文件格式转换的文章。
对于Windows编程来说,除了处理网络协议以外,处理几种类型的文件格式更加重要,这些文件格式的掌握有利于更好的让自己的程序和Windows系统贴近。
我们程序员们常常被如下格式的文件所困扰:
1、图像文件格式:如:BMP、JPG、Gif、Png等;
2、声音文件格式:如:Wav、MIDI等;
3、视频文件格式:如:AVI、RMVB、RM等;
4、私有的非公开的文件格式:如:doc、xls等。
其实,任何语言当你了解了文件格式的标准的时候都可以处理,并不是局限于某一种开发语言。因此,在这里我也想给VB的支持者们鼓鼓劲,VB作为一个强大Windows软件的开发语言,处理这些文件格式自然是不在话下了。
今天,我们只给大家介绍图形格式转换方面的一些小技巧。
首先,让我们认识最基本的图形文件结构“BMP”。
BMP是一种与硬件设备无关的图像文件格式,使用非常广。它不采用任何压缩,因此,BMP文件所占用的空间很大。由于BMP文件格式是Windows环境中交换与图有关的数据的一种标准,因此在Windows环境中运行的图形图像软件都支持BMP图像格式。BMP文件格式也被认为是一个基本的图像文件格式。
BMP的文件结构方式:
BMP文件存储数据时,图像的扫描方式是按从左到右、从下到上的顺序。
如下图所示:
我们在绘图版中画了一个点,这个点只有3个像素,我们把它染成红色、紫色、黄色,这时候,将它保存为BMP文件。
然后,我们用UltraEdit-32打开这个BMP,选择十六进制编辑器,如图所示:
然后,我们观察这个文件中的格式:
我们分别放进去的三个颜色是:
红:255、0、0
紫:128、128、255
黄:255、255、0
这时候,我们再对比文件中的字节:
这恰恰不就是这三个颜色的值吗?
所以,BMP格式的图形文件是没有进行任何压缩的,而是老老实实的将每一个像素点的位置标示出来,告诉图形软件哪个像素点应该显示什么颜色而已。至于前面的字节是描述该图像文件类型,图像深度等。
那么好,因为它太大,所以才有人研究了对BMP压缩的算法,有JPEG、GIF、PNG,这几种压缩算法。
大家经常用的看图软件ACDSEE,在用的时候心想,好棒啊,这个软件可以把各种格式的图形文件进行转换。如果做到ACDSEE那样,甚至是PhotoShop那样,岂不是得研究压缩算法吗?
我告诉大家,根本就不用研究压缩算法,Windows提供了很好的工具函数——GDI+,通过这个函数工具组,便可以完成任意图形文件格式之间的转换。
我们给出转换的方法:
1、声明函数和结构
Private Type GUID
Data1 As Long
Data2 As Integer
Data3 As Integer
Data4(0 To 7) As Byte
End Type
Private Type GdiplusStartupInput
GdiplusVersion As Long
DebugEventCallback As Long
SuppressBackgroundThread As Long
SuppressExternalCodecs As Long
End Type
Private Type EncoderParameter
GUID As GUID
NumberOfValues As Long
type As Long
Value As Long
End Type
Private Type EncoderParameters
count As Long
Parameter As EncoderParameter
End Type
Private Declare Function GdiplusStartup Lib "GDIPlus" (token As Long, inputbuf As GdiplusStartupInput, Optional ByVal outputbuf As Long = 0) As Long
Private Declare Function GdiplusShutdown Lib "GDIPlus" (ByVal token As Long) As Long
Private Declare Function GdipCreateBitmapFromHBITMAP Lib "GDIPlus" (ByVal hbm As Long, ByVal hPal As Long, BITMAP As Long) As Long
Private Declare Function GdipDisposeImage Lib "GDIPlus" (ByVal Image As Long) As Long
Private Declare Function GdipSaveImageToFile Lib "GDIPlus" (ByVal Image As Long, ByVal FileName As Long, clsidEncoder As GUID, encoderParams As Any) As Long
Private Declare Function CLSIDFromString Lib "ole32" (ByVal Str As Long, id As GUID) As Long
Private Declare Function CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Dest As Any, Src As Any, ByVal cb As Long) As Long
2、BMP转换JPG
Dim Quality As Byte
Dim TIFF_ColorDepth As Long
DimTIFF_Compression As Long
Screen.MousePointer = vbHourglass
Dim tSI As GdiplusStartupInput
Dim lRes As Long
Dim lGDIP As Long
Dim lBitmap As Long
Dim aEncParams() As Byte
Dim pict As StdPicture

On Error GoTo ErrHandle:

Quality=80
TIFF_ColorDepth=24
TIFF_Compression=6
pict=Picture1.Picture

tSI.GdiplusVersion = 1
lRes = GdiplusStartup(lGDIP, tSI)
lRes = GdipCreateBitmapFromHBITMAP(pict.Handle, 0, lBitmap)
Dim tJpgEncoder As GUID
Dim tParams As EncoderParameters
CLSIDFromString StrPtr("{557CF401-1A04-11D3-9A73-0000F81EF32E}"), tJpgEncoder
tParams.count = 1
With tParams.Parameter ' Quality
CLSIDFromString StrPtr("{1D5BE4B5-FA4A-452D-9CDD-5DB35105E7EB}"), .GUID
.NumberOfValues = 1
.type = 4
.Value = VarPtr(Quality)
End With
ReDim aEncParams(1 To Len(tParams))
Call CopyMemory(aEncParams(1), tParams, Len(tParams))
上面的程序是将Picture1中的图像,转换成JPG的一个方法,最终我们得到了一个JPG的数组,当然,你可以随便处理,也可以存放为文件,也可以另作处理。
大家看利用这个方法作图形格式的转换和VB本身有关系吗?
钟声
2009-7-7
分享到:
评论

相关推荐

    "利用GDI+进行图像处理"源码发布

    各种基本图像处理操作: 矩形选择、移动图层、套索工具、魔术棒、放大镜、移动图像、添加文字、拾取颜色、钢笔、毛笔、橡皮擦、消除红眼、填充颜色、填充图案、印章工具、图形剪切、渐变填色、画线、图像变形、添加...

    vb Gdi+图像变形、透明处理

    运用Gdi+技术对图像进行圆形、任意四边形、扇形拉伸,半透明、透度渐变、任意角度旋转等处理。思路不成熟,下载后如有好的思路,共同学习探讨。

    vb gdi+无锯齿旋转图像

    利用GDI+旋转图像时,如果不经特殊处理,周边会有锯齿,就是画布设为消锯齿也无用。但可用纹理画刷来得到完全没有锯齿的旋转后的图像。我这里有一个小程序,帮你实现得到无锯齿图像的愿望。

    VB6&GDI+实现精准中英字符测绘,可自定义行距字距

    VB6&GDI+实现精准中英字符测绘,可自定义行距字距。本人写的试验代码,有大量BUG。测绘之中有少许的浮点误差——这是字体设计单位浮点计算造成的,不可避免. 因为代码中很少注释,我在这里说一下关键:重点是GDI+的...

    VB60用 GDI+将图像章保存为JPG\TIFF\PNG\GIF\BMP等格式 作 者 : laviewpbt

    VB60用 GDI+将图像章保存为JPG\TIFF\PNG\GIF\BMP等格式

    vb GDI+无锯齿旋转图像

    通常图像旋转小角度时图像边沿会有锯齿,即使你...我们可以利用图像纹理画刷,对图像输出位置进行缩小1-3个像素二次绘制,这时画布应设为消锯齿,便可以得到完全没有锯齿的旋转后的图像。(自己添加gdiplus声明模块)

    GDI+动态链接库 gdiplus.dll

    微软GDI+动态链接库 gdiplus.dll

    VB 经典GDI+模块

    VB6 经典GDI+模块 可实现透明窗体、载入透明PNG等多种功能 100+ k的模块,功能详尽

    VB6 编写的GDI+程序例子

    通过Visual Basic 6.0 应用GDI+绘制图形,显示图片的例子,采用静态链接库实现,简单方便。 附上教程:http://download.csdn.net/detail/veron_04/4039695

    精通VB6 GDI+编程

    通过上百个VB GDI+示例,如用户熟悉和掌握VB6 GDI+编程。

    VB.Net:Image图片处理 GDI+绘图技术

    用到的知识点: 获取图片的缩略图 鼠标拽区,截取图片的指定区域 在Panel控件上绘图,绘制鼠标拽出来的矩形。双重缓存的运用。Invalidate、Paint重绘控件。 Bitmap,Image,Rectangle运用。 程序界面:...

    VB6 GDI+入门教程(最新版)

    GDI+是GDI的延生,应用于WinXP及更新版的Windows系统。...现有的很多介绍GDI+的资料不少,但几乎都是基于.Net的,而介绍用VB6开发GDI+的资料却少之又少,偏偏又不少人需要用VB6来开发GDI+程序。所以这个资料不可多得。

    VB.Net GDI+ 应用例子

    VB.Net GDI+ 应用例子,用GDI+设计显示不同风格的文本形式,一个绘图工具的应用例子

    Windows窗体控件:使用GDI +的VB.NET半透明控件

    使用GDI +和VB.NET构建标准的Windows Forms半透明控件

    GDI+ 在picturebox上绘图

    包含了: GDI+ 资料一份 在picturebox上绘图,自定义画笔

    vb 用GDI+如何绘制任意四边形图像详细介绍

    vb运用Gdi+实现矩形、平行四边形图像很容易。如果要绘制任意四边形图像就不是一件容易的事,因为在Gdi+中没有具体实现的函数。究竟能不能实现呢?答案是肯定的。 要绘制任意四边形图像,矩形图像无法一次绘制出整个...

    VB6 gdi+图形处理封装mGdip.bas

    格式化了API函数和结构体使之更易读 '6.Enum ImageType -> Enum GdipImageType '7.增加 NewPointF,NewPointL,NewPointsF,NewPointsL,NewColors 函数 '8.增加 Zero(Point/Rect)(F/L) 0变量 ' '2011-2-7 '1.修正...

    VB GDI+声明

    VB GDI+声明 只有你想不到没有你找不到。版权(bloger:Vistar)不是我的,传上来共享下,顺便赚点积分。

    VB6 GDI+ 包装类库源码

    VB6通过使用本GDI+ 包装类库,可以方便地支持各种格式的图片。比如可以让Picture Box方便加载JPG、PNG、TIF等格式图片,而且还可以把Picture Box保存为JPG等格式,支持图片格式转换等等。

Global site tag (gtag.js) - Google Analytics