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
Dim TIFF_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本身有关系吗?
 







 本文转自 useway 51CTO博客,原文链接:http://blog.51cto.com/useway/175050,如需转载请自行联系原作者

相关文章
|
Windows
游戏编程之十 图像引擎DirectXDraw
游戏编程之十 图像引擎DirectXDraw
74 0
|
6月前
|
机器学习/深度学习 并行计算 算法
OpenCV简介、导入及图像处理基础方法讲解(图文解释 附源码)
OpenCV简介、导入及图像处理基础方法讲解(图文解释 附源码)
138 0
|
传感器 存储 编解码
即时通讯音视频开发(二十):一文读懂视频的颜色模型转换和色域转换
本文将以通俗易懂的文字,引导你理解视频是如何从采集开始,历经各种步骤,最终通过颜色模型转换和不同的色域转换,让你看到赏心悦目的视频结果的。
81 0
|
编解码 API C#
c#万能视频播放器(附代码)
c#万能视频播放器(附代码)
374 0
|
程序员 数据安全/隐私保护
数字水印的嵌入与提取---OpenCV-Python开发指南(6)
数字水印的嵌入与提取---OpenCV-Python开发指南(6)
585 0
数字水印的嵌入与提取---OpenCV-Python开发指南(6)
|
算法 Android开发 C语言
图像滤镜艺术---ZPhotoEngine超级算法库
原文:图像滤镜艺术---ZPhotoEngine超级算法库 一直以来,都有个想法,想要做一个属于自己的图像算法库,这个想法,在经过了几个月的努力之后,终于诞生了,这就是ZPhotoEngine算法库。
2557 0
|
vr&ar 图形学
【Unity3D 灵巧小知识点】☀️ | Unity 四元数、欧拉角 与 方向向量 之间转换
Unity 小科普 老规矩,先介绍一下 Unity 的科普小知识: Unity是 实时3D互动内容创作和运营平台 。 包括游戏开发、美术、建筑、汽车设计、影视在内的所有创作者,借助 Unity 将创意变成现实。
|
编解码 计算机视觉
带你读《InDesign CC排版设计全攻略:视频教学版》之二:图形与图像处理
InDesign是一款主流的专业排版设计软件,被广泛应用于书刊、媒体、平面设计、印刷出版和数字媒体等领域。本书图文并茂地讲解中文版InDesign CC 2018的各项功能、应用技巧和设计手段。为了达到学以致用的目的,全书以丰富示例详解软件的各项实用功能和重点参数,并穿插介绍大量的工作流程以及书刊、画册的编排经验和设计方法。另外,本书还提供了几个具有挑战性的综合案例,让你跟随书中的设计思路一步步地实现项目要求的效果。本书提供了丰富的设计案例和供下载的教学视频,特别适合InDesign新手阅读。对具有一定使用经验的用户,其中的案例也有很好的参考价值。本书还可作为职业学校、培训机构的教学用书。
图像滤镜艺术--编码基础(Photoshop基础变换的代码实现)
原文:图像滤镜艺术--编码基础(Photoshop基础变换的代码实现) 自从上一篇博客写完之后,到现在已经有段时间了,这段时间不是不想接着写,只是想做的更好了在写出来给大家看呵呵。
1422 0
|
C# 区块链
图像滤镜艺术---保留细节的磨皮之C#程序实现
原文:图像滤镜艺术---保留细节的磨皮之C#程序实现 上一篇博文“保留细节的磨皮滤镜之PS实现”一文中,我简单介绍了本人自己总结的一种非常简单的磨皮滤镜,这个滤镜在磨光皮肤的同时,会保留很不错的细节,今天,我将介绍使用C#程序实现这个磨皮的过程。
1392 0
下一篇
无影云桌面