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

(vb)利用GetBitmapBits,SetBitmapBits加速图像处理 (vb)利用GetBitmapBits,SetBitmapBits加速图像处理(不知道前面有没有人写过这个,这里主要是最近写程序的一些心得,希望对大家有用.久未写东西,会有一堆的毛病,将就着吧.)最近发现了两个好东东,SetBitmapBits,GetBitmapBits,能极大的提高某些图像处理的速度.引用别人的话"SetBitmapBits: vb声明: Declare Function Se 阅读详情
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
VB6下的BitMap示例:模拟雨点程序 窗体部分Dim N As tpBitMapApplic Dim SPX() As tpPixelRGB24 Dim pubBitMapApplic As tpBitMapApplic Dim pubPixels() As tpPixelRGB24 Dim pubBytes() As Byte Dim pubBitMapInfo As tpBitMapInfo Di 阅读详情

相关推荐

VB压缩图片代码

VB压缩图片Option ExplicitPrivate Type GUID    Data1 As Long    Data2 As Integer    Data3 As Integer    Data4(0 To 7) As ByteEnd TypePrivate Type GdiplusStartupInput    GdiplusVersion As Long    DebugEv

tuzi_xz的专栏 4556

VB6.0用GDI+保存图像为BMP\JPG\PNG\GIF格式终结版。

鉴于之前在http://blog.youkuaiyun.com/laviewpbt/article/details/756547发布的代码很匆忙,也存在不少错误,现发布比较完美版的解决方案。 Option Explicit Private Const UnitPixel As Long = 2 Private Const EncoderQuality ...

weixin_33862188的博客 370

VB图像格式转换教程:BMP转JPG与JPG转BMP

在数字时代的浪潮下,图像格式转换作为处理图像数据的重要手段,成为开发者必须掌握的技能之一。本章节首先将概述图像格式转换的基本概念和重要性,为读者揭示VB(Visual Basic)环境下图像处理的基础。BMP(Bitmap)格式是一种图形文件格式,最初由微软公司为Windows操作系统开发。BMP文件格式诞生于1980年代早期,是Windows 1.0操作系统中用于存储图像的格式,目的是为了提供一种简便的方式来在不同应用程序之间共享图像数据。

weixin_42668301的博客 1162

VB6GDI包装类库源码介绍:扩展VB6图像处理能力,轻松兼容多种格式

VB6GDI包装类库源码介绍:扩展VB6图像处理能力,轻松兼容多种格式 去发现同类优质开源项目:https://gitcode.com/ 在现代软件开发领域,图像处理一直是应用程序的重要组成部分。对于VB6开发者而言,VB6GDI+ 包装类库源码的推出无疑是一项重要的资源,它为VB6应用程序的图像处理功能带来了革命性的扩展。 项目介绍 VB6GDI+ 包装类库源码是一组专门为Visual Basi...

gitblog_06797的博客 383

VB图像剪切技术详解与实践

在现代的软件应用中,图像处理已经成为了不可或缺的功能之一。特别是图像剪切,它作为图像处理的一个重要环节,在设计图形用户界面(GUI)和进行图像处理时具有广泛的应用。使用VB(Visual Basic)进行图像剪切,不仅可以提高开发效率,还能通过编程逻辑实现复杂的图像处理需求。VB作为一种流行的编程语言,其图像剪切功能主要依赖于.NET Framework提供的GDI+库。GDI+提供了强大的图像处理能力,包括绘制、转换、合成等操作,这对于图像剪切来说是基础且必要的。

weixin_42588555的博客 1048

使用VB实现图片水印添加及关键操作指南

Visual Basic(简称VB)是微软公司推出的一种简单易学的编程语言,它属于面向对象的编程语言。VB是基于BASIC语言发展而来,以其“所见即所得”的RAD(快速应用程序开发)工具著称,让开发者可以快速搭建用户界面,并以此为基础编写程序逻辑。本章介绍了在VB中加载和保存图片的基本技术。我们了解了使用FileStream和Bitmap类加载图片的不同方法,并比较了它们的适用场景和优势。同时,我们还学习了如何将处理后的图片保存到文件或内存流中,并探讨了这些操作的不同用途。

weixin_42561464的博客 1034

VB6 GDI+ 包装类库源码介绍

VB6 GDI+ 包装类库源码介绍 去发现同类优质开源项目:https://gitcode.com/ 资源概述 此资源提供了一组VB6 GDI+ 包装类库的源码,旨在帮助开发者扩展VB6应用程序的图像处理功能。通过这个类库,VB6开发者可以轻松实现对多种图像格式的支持。 功能特点 图片加载支持:使得VB6应用程序能够加载常见的图像格式,如JPG、PNG、TIF等。 图片格式转换:支持将图片从一种...

gitblog_06736的博客 393

在VB中实现PNG图像资源应用的实战指南

图形处理是计算机视觉和图像处理领域的核心议题,而在众多图像格式中,PNG格式以其独特的优势在专业和非专业领域中广受欢迎。本章将简要介绍PNG图像的几个主要优势,为读者提供一个基础的理解。GDI+作为Windows平台下的图形处理库,能够执行各种图形操作任务,如绘图、图像处理、文本渲染等。它的核心优势包括:支持多种图形格式:GDI+支持多种图像格式,尤其是高质量的PNG图像,这种格式支持无损压缩和透明度。

weixin_42433737的博客 1049

VB6 在内存中生成bitmap图像,并将其保存为byte()数组

在VB6内存中创建bitmap图像,并将其保存为byte()数组 在项目中添加一个模块,用于封装GDIPlus函数 从内存中创建相应的信息 '全局声明 Dim token As Long Dim graphics As Long Dim img As Long, W As Long, H As Long Dim pen As Long Dim brush As ...

skdsucceed的博客 2902

Visual Basic中实现图片格式转换的方法

在进行VB6图片格式转换的过程中,第三方库可以提供很多便利。第三方库的优势主要体现在:功能丰富:大多数第三方库都提供了非常丰富的图像处理功能,包括格式转换、图像压缩、图像旋转、图像特效等。简化编程:使用第三方库,开发者不需要深入了解底层的图像处理细节,只需要调用库提供的接口即可实现复杂的图像处理功能。提升效率:第三方库经过优化,通常比自己实现代码具有更高的效率。减少错误:预先经过测试的第三方库能减少由图像处理引发的bug。

weixin_42594419的博客 1243

Obsidian的Git插件设置配置全流程 -- 简单的电脑端多平台同步方案及常见问题

Git同步obsidian的保姆级教程和常见问题

weixin_44370439的博客 1万+
上一篇: VB无所不能之一:指针
下一篇: VB无所不能之三:VB截获Windows消息的钩子
useway
useway 领域专家: Java技术领域 领域专家: Java技术领域
博客等级 码龄24年 3424粉丝 162原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值