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本身有关系吗?
钟声
2009-7-7

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

  1. VB无所不能之七:VB的多线程(2)

    云查杀很牛X的金山毒霸!免费啦!2011下载链接! 久违啦,我今天终于又可以写博客了,VB无所不能这个系列写作途中总是磕磕绊绊的,终于写到第七篇多线程的时候,中断了长达1个多月的时间没有更新新帖,对大 ...

  2. matlab 方波_MATLAB之Simulink(二)利用switch模块将正弦信号变为方波信号

    ##MATLAB之Simulink(二) ##利用switch模块将正弦信号变为方波信号 今天给大家展示一个simulink电路仿真,将正弦信号转化为方波信号. 下面开始教程: 1.首先直接在MATL ...

  3. VB无所不能之五:建立“标准”DLL动态链接库文件(1)

    VB无所不能之五:建立"标准"DLL动态链接库文件(1) --作者:钟声 博客地址:http://useway.blog.51cto.com 动态链接库经常被认为是VC或者Deph ...

  4. 利用MATLAB进行系统时域分析,实验二 利用matlab进行系统的时域分析

    实验二 利用matlab进行系统的时域分析 实验二 利用MATLAB进行系统的时域分析 1.实验目的 在理论学习的基础上,通过本实验熟悉LTI连续时间系统的时域分析方法, 熟悉系统的零输入响应.零状态 ...

  5. matlab simulink_MATLAB之Simulink(二)利用switch模块将正弦信号变为方波信号

    ##MATLAB之Simulink(二) ##利用switch模块将正弦信号变为方波信号 今天给大家展示一个simulink电路仿真,将正弦信号转化为方波信号. 下面开始教程: 1.首先直接在MATL ...

  6. VB控件注册 - 利用资源文件将dll、ocx打包进exe文件

    很多时候自定义或者引用控件都需要注册才能使用,但是如何使要注册的dll或ocx打包到exe中,使用户下载以后看到     现在介绍一下使用资源文件,将dll.ocx打包进exe,点击直接注册的例子: ...

  7. 实验二利用自动机理论实现词法分析器

    实验二利用自动机理论实现词法分析器 1.实验目的熟悉词法分析阶段的要求,掌握利用自动机理论实现词法分析器的方法. 2.实验设备硬件:PC 机一台软件:Windows 系统,高级语言集成开发环境 3.实 ...

  8. 【Microsoft Azure 的1024种玩法】六十二.利用Azure Private DNS 实现虚拟网络中域名的管理解析

    [简介] Azure Private DNS是Azure为我们虚拟网络提供的安全可靠的DNS服务,我们无需自行配置DNS即可在虚拟网络中实现域名的解析及配置, 于此同时,我们在内网中也可以利用自己的自 ...

  9. 实验二利用MATLAB工具箱对混杂噪声的音频信号进行滤波

    实验二利用MATLAB工具箱对混杂噪声的音频信号进行滤波 一.小提琴音频的加噪去噪处理 要求:选择子作业1中的音频信号,自行给定滤波器的系统函数,分别采用时域线性卷积和差分方程两种方法对音频信号进行滤 ...

最新文章

  1. mysql数据更新回退_Mysql的几个灵魂拷问(一)
  2. R语言原生hist函数绘制直方图实战
  3. websocket创建失败_SpringBoot2.2 实践WebSocket被不靠谱的百度搜索结果坑了多少人
  4. vue-loader 源码分析
  5. 生成docker镜像
  6. 高性能服务器模型分类
  7. 监督学习 | ID3 C4.5 决策树原理
  8. 第17课 欧耶欧耶 《小学生C++趣味编程》
  9. hbase linux 命令,在linux下操作hbase
  10. Windows10下解压版mysql-8.0.11安装教程
  11. 2016年银行业专业人员初级资格考试《个人理财》考试大纲
  12. 激光雷达考试基础知识
  13. 一不小心画了 24 张图剖析计网应用层协议!
  14. linux redhat 去掉警报声音
  15. HTML期末大学生网页设计作业--官网仿qq音乐(1页)
  16. html5 按钮效果,7款外观迷人的HTML5/CSS3 3D按钮特效
  17. Job和CronJob介绍
  18. html省市插件,省市区三级联动:非常好用的纯js插件
  19. 2022IC秋招面经分享【禾赛科技·FPGA开发工程师(上海)】
  20. linux ps显示完整command

热门文章

  1. linux yum安装卸载jdk8
  2. windows 7宣布停止xp
  3. 交通信息工程课程设计
  4. CVE-2020-14644 weblogic iiop反序列化漏洞分析
  5. optisystem软件配合matlab出图快速保存实验图
  6. 华兴资本年营收25亿:净利16亿 同比增56.5%
  7. cs231n-2022-assignment2#Q1:多层全连接神经网络
  8. 如何解决电脑0x000000F4蓝屏代码
  9. FastAdmin 系统配置的使用
  10. 如何把视频中的声音提取出来转化成文字?