Skip to content

cImage - 图片数据互转类

概述

cImage 提供了 Byte()Base64StdPicture 三种图片数据格式的互转功能,采用链式调用设计,一行代码即可完成复杂转换。

通过 VBMAN.Image 全局静态实例直接使用,无需手动实例化。

核心特性

  • 链式调用: 流畅的 API 设计,一行代码完成转换 + 输出
  • 三种格式互转: 字节数组、Base64 字符串、StdPicture 对象之间自由转换
  • Data URI 支持: 自动解析 data:image/jpeg;base64,... 格式
  • MIME 类型检测: 通过文件魔数自动识别 JPEG/PNG/GIF/BMP/WebP/ICO
  • 控件直赋: ShowTo 方法直接将图片显示到 Image/PictureBox 控件
  • 默认成员: Data 方法为默认成员,支持 VBMAN.Image.(base64Str) 简写

调用方式

vb
' 全局静态实例(推荐)
VBMAN.Image.Data(base64Str).ReturnPicture

' 简写法(利用默认成员)
VBMAN.Image.(base64Str).ReturnPicture

' 独立实例
Dim img As New cImage
Set Image1.Picture = img.Data(bytesArr).ReturnPicture

方法总览

链式入口方法

方法说明返回
Data设置数据源(默认成员)cImage (Me)

链式辅助方法

方法说明返回
SetMimeType手动设置 MIME 类型cImage (Me)
ShowTo将图片显示到目标控件cImage (Me)

输出方法(终结方法)

方法说明返回
ReturnBytes输出为字节数组Byte()
ReturnBase64输出为 Base64 字符串String
ReturnPicture输出为 StdPicture 对象StdPicture
ReturnDataUri输出为 Data URI 字符串String
ReturnMimeType返回检测到的 MIME 类型String

检查方法

方法说明返回
IsValid检查数据是否有效Boolean

方法详解

Data

链式调用入口,接受三种数据类型。为默认成员,支持简写 VBMAN.Image.(data)

vb
Public Function Data(ByVal vData As Variant) As cImage

参数:

参数名类型说明
vDataVariant数据源,支持 Byte() 数组、Base64 字符串、StdPicture 对象

支持的输入类型:

类型判断依据示例
Byte() 数组VarType = vbArray Or vbByte读取图片文件的字节数据
Base64 字符串VarType = vbStringAPI 返回的头像 Base64
Data URI 字符串data: 开头data:image/png;base64,...
StdPicture 对象IsObject(vData)Image1.Picture

Data URI 自动解析:

传入 data:image/jpeg;base64,xxxxx 格式的字符串时,自动提取 MIME 类型并剥离前缀,仅保留纯 Base64 部分。

返回: cImage (Me),支持链式调用

示例:

vb
' 从 Base64 字符串
VBMAN.Image.Data("/9j/4AAQ...").ReturnPicture

' 从字节数组
Dim bytes() As Byte
bytes = VBMAN.FileEx.OpenFile("photo.jpg", "R").ReadData.ReturnBytes
VBMAN.FileEx.CloseFile
VBMAN.Image.Data(bytes).ReturnBase64

' 从 StdPicture
VBMAN.Image.Data(Image1.Picture).ReturnBase64

' 简写法(利用默认成员)
VBMAN.Image.("/9j/4AAQ...").ReturnPicture

' Data URI 格式自动解析
VBMAN.Image.("data:image/png;base64,iVBOR...").ReturnPicture

SetMimeType

手动设置 MIME 类型,用于覆盖自动检测结果或补充无法检测的格式。

vb
Public Function SetMimeType(ByVal MimeType As String) As cImage

参数:

参数名类型说明
MimeTypeStringMIME 类型,如 "image/jpeg""image/png"

返回: cImage (Me),支持链式调用

示例:

vb
' 手动指定 MIME 类型(影响 ReturnDataUri 输出)
VBMAN.Image.Data(bytes).SetMimeType("image/png").ReturnDataUri

' 从 StdPicture 获取时无法自动检测格式,需手动指定
VBMAN.Image.Data(Image1.Picture).SetMimeType("image/bmp").ReturnDataUri

ShowTo

将图片直接显示到目标控件,是最便捷的显示方式。

vb
Public Function ShowTo(ByVal Target As Object) As cImage

参数:

参数名类型说明
TargetObject任何拥有 Picture 属性的控件对象(Image、PictureBox 等)

返回: cImage (Me),支持链式调用

示例:

vb
' 传统写法 - 需要 Set 关键字
Set Image1.Picture = VBMAN.Image.Data(base64Str).ReturnPicture

' 简写法 - 一行搞定
VBMAN.Image.(base64Str).ShowTo Image1

' 链式显示后再获取 Base64
Dim b64 As String
b64 = VBMAN.Image.(base64Str).ShowTo(Image1).ReturnBase64

' 显示到 PictureBox
VBMAN.Image.(bytesArr).ShowTo Picture1

' 从 StdPicture 显示到另一个控件
VBMAN.Image.Data(Picture1.Picture).ShowTo Image2

ReturnBytes

将图片数据转换为字节数组输出。

vb
Public Function ReturnBytes() As Byte()

返回: Byte() 字节数组

示例:

vb
' Base64 → 字节数组
Dim bytes() As Byte
bytes = VBMAN.Image.Data(base64Str).ReturnBytes

' StdPicture → 字节数组(可用于保存图片)
Dim picBytes() As Byte
picBytes = VBMAN.Image.Data(Image1.Picture).ReturnBytes

' 将字节数组写入文件
VBMAN.FileEx.SetBufferBytes(bytes).SaveData "C:\output.jpg"

ReturnBase64

将图片数据转换为 Base64 字符串输出。

vb
Public Function ReturnBase64() As String

返回: String - 纯 Base64 字符串(不含 data: 前缀)

示例:

vb
' 字节数组 → Base64
Dim b64 As String
b64 = VBMAN.Image.Data(bytes).ReturnBase64

' StdPicture → Base64
Dim picB64 As String
picB64 = VBMAN.Image.Data(Image1.Picture).ReturnBase64

' 用于 API 请求
Dim json As New cJson
json("avatar") = VBMAN.Image.Data(Image1.Picture).ReturnBase64
Dim resp As String
resp = VBMAN.HttpClient.SetUrl("/api/upload").SetBody(json.Encode).Post

ReturnPicture

将图片数据转换为 StdPicture 对象输出,可直接赋给控件的 Picture 属性。

vb
Public Function ReturnPicture() As StdPicture

返回: StdPicture 对象

示例:

vb
' Base64 → StdPicture
Set Image1.Picture = VBMAN.Image.Data(base64Str).ReturnPicture

' 字节数组 → StdPicture
Set Image1.Picture = VBMAN.Image.Data(bytes).ReturnPicture

' Data URI → StdPicture
Set Image1.Picture = VBMAN.Image.("data:image/png;base64,iVBOR...").ReturnPicture

ReturnDataUri

将图片数据转换为 Data URI 格式字符串输出,适合直接嵌入 HTML/CSS。

vb
Public Function ReturnDataUri(Optional ByVal MimeType As String) As String

参数:

参数名类型必填说明
MimeTypeStringMIME 类型,省略时使用自动检测或默认 image/jpeg

返回: String - Data URI 格式字符串,如 data:image/png;base64,iVBORw0KGgo...

示例:

vb
' 自动检测 MIME 类型
Dim uri As String
uri = VBMAN.Image.Data(bytes).ReturnDataUri
' 输出: data:image/jpeg;base64,/9j/4AAQ...

' 手动指定 MIME 类型
uri = VBMAN.Image.Data(bytes).SetMimeType("image/png").ReturnDataUri
' 输出: data:image/png;base64,iVBORw0KGgo...

' 嵌入 HTML
Dim html As String
html = "<img src='" & VBMAN.Image.Data(bytes).ReturnDataUri & "'>"
WebBrowser1.Document.Write html

' 从 Base64 生成 Data URI
uri = VBMAN.Image.Data(base64Str).ReturnDataUri("image/png")

ReturnMimeType

返回自动检测到的图片 MIME 类型。

vb
Public Function ReturnMimeType() As String

返回: String - MIME 类型字符串

支持的检测格式:

格式魔数 (Hex)MIME 类型
JPEGFF D8 FFimage/jpeg
PNG89 50 4E 47image/png
GIF47 49 46image/gif
BMP42 4Dimage/bmp
WebP52 49 46 46 ... 57 45 42 50image/webp
ICO00 00 01 00image/x-icon

示例:

vb
' 检测图片类型
Dim mime As String
mime = VBMAN.Image.Data(bytes).ReturnMimeType
Debug.Print mime  ' 输出: image/png

' 判断类型后分别处理
Select Case mime
    Case "image/jpeg"
        ' JPEG 处理逻辑
    Case "image/png"
        ' PNG 处理逻辑
    Case Else
        ' 其他格式
End Select

IsValid

检查数据源是否有效(是否已通过 Data 方法设置了数据)。

vb
Public Function IsValid() As Boolean

返回: Boolean - 数据有效时返回 True

示例:

vb
Dim img As New cImage
img.Data(base64Str)

If img.IsValid Then
    Set Image1.Picture = img.ReturnPicture
Else
    MsgBox "图片数据无效!"
End If

综合示例

示例1: API 头像显示

从 API 获取用户头像 Base64,直接显示到 Image 控件:

vb
Private Sub LoadUserAvatar(userId As Long)
    ' 从 API 获取头像 Base64
    Dim resp As String
    resp = VBMAN.HttpClient.SetUrl("/api/user/" & userId & "/avatar").Get
    
    ' 解析 JSON 获取 avatar 字段
    Dim json As cJson
    Set json = VBMAN.Json.Decode(resp)
    Dim avatarB64 As String
    avatarB64 = json("avatar")
    
    ' 显示到 Image 控件(一行搞定)
    VBMAN.Image.(avatarB64).ShowTo Image1
End Sub

示例2: 图片上传到服务器

将本地图片转为 Base64 后上传到 API:

vb
Private Sub UploadImage(filePath As String)
    ' 读取图片文件为字节数组
    VBMAN.FileEx.OpenFile filePath, "R"
    Dim bytes() As Byte
    bytes = VBMAN.FileEx.ReadData.ReturnBytes
    VBMAN.FileEx.CloseFile
    
    ' 转为 Base64 并检测类型
    Dim img As cImage
    Set img = VBMAN.Image.Data(bytes)
    Dim b64 As String
    b64 = img.ReturnBase64
    Dim mime As String
    mime = img.ReturnMimeType
    
    ' 构建请求 JSON
    Dim json As New cJson
    json("image") = b64
    json("mime_type") = mime
    
    ' 上传
    Dim resp As String
    resp = VBMAN.HttpClient _
        .SetUrl("/api/upload") _
        .SetBody(json.Encode) _
        .Post
End Sub

示例3: 图片 Data URI 嵌入 HTML

将图片转为 Data URI 嵌入 WebBrowser 页面:

vb
Private Sub ShowEmbeddedImage(filePath As String)
    ' 读取图片
    VBMAN.FileEx.OpenFile filePath, "R"
    Dim bytes() As Byte
    bytes = VBMAN.FileEx.ReadData.ReturnBytes
    VBMAN.FileEx.CloseFile
    
    ' 获取 Data URI
    Dim dataUri As String
    dataUri = VBMAN.Image.Data(bytes).ReturnDataUri
    
    ' 嵌入 HTML
    Dim html As String
    html = "<html><body>" & _
           "<img src='" & dataUri & "' style='max-width:300px'>" & _
           "</body></html>"
    WebBrowser1.Document.Write html
End Sub

示例4: 图片格式互转全流程

完整演示三种格式之间的互转:

vb
Private Sub TestImageConversion()
    Dim img As cImage
    
    ' 1. 字节数组 → Base64 + StdPicture + Data URI
    Dim bytes() As Byte
    bytes = VBMAN.FileEx.OpenFile("C:\photo.jpg", "R").ReadData.ReturnBytes
    VBMAN.FileEx.CloseFile
    
    Set img = VBMAN.Image.Data(bytes)
    Debug.Print "MIME: " & img.ReturnMimeType        ' image/jpeg
    Debug.Print "Base64长度: " & Len(img.ReturnBase64)
    Set Image1.Picture = img.ReturnPicture
    
    ' 2. Base64 → 字节数组 + StdPicture
    Dim b64 As String
    b64 = img.ReturnBase64
    
    Set img = VBMAN.Image.Data(b64)
    Dim newBytes() As Byte
    newBytes = img.ReturnBytes
    Set Image2.Picture = img.ReturnPicture
    
    ' 3. StdPicture → Base64 + 字节数组
    Set img = VBMAN.Image.Data(Image2.Picture)
    Dim picB64 As String
    picB64 = img.SetMimeType("image/bmp").ReturnBase64
    Dim picBytes() As Byte
    picBytes = img.ReturnBytes
    
    Debug.Print "转换完成!"
End Sub

示例5: 批量头像显示

从数据库批量获取头像 Base64 并显示到多个控件:

vb
Private Sub LoadAllAvatars()
    ' 查询所有用户头像
    VBMAN.Db.Sql("SELECT id, avatar FROM users").Fetch
    
    Dim i As Long
    For i = 0 To VBMAN.Db.RowCount - 1
        VBMAN.Db.Row i
        
        ' 根据用户 ID 找到对应的 Image 控件
        Dim ctrlName As String
        ctrlName = "imgAvatar" & VBMAN.Db.Field("id")
        
        ' 一行代码显示头像
        VBMAN.Image.(VBMAN.Db.Field("avatar")).ShowTo Me.Controls(ctrlName)
    Next i
End Sub

转换流程图

                    ┌─────────────┐
                    │   Data()    │ ← 链式入口(默认成员)
                    └─────────────┘

          ┌───────────────┼───────────────┐
          │               │               │
    Byte() 数组      Base64 字符串    StdPicture
          │               │               │
          └───────────────┼───────────────┘

              ┌───────────┼───────────┐
              │           │           │
        ReturnBytes  ReturnBase64  ReturnPicture
              │           │           │
              │      ReturnDataUri   ShowTo(控件)
              │           │           │
              └───────────┼───────────┘

                    ┌─────────────┐
                    │ ReturnMimeType │ ← MIME 类型检测
                    └─────────────┘

注意事项

  1. StdPicture → 字节数组: 内部通过 SavePicture 保存临时文件再读取,输出为 BMP 格式
  2. MIME 类型检测: 仅对字节数组输入有效,Base64 和 StdPicture 输入需手动指定
  3. Data URI 格式: ReturnBase64 返回纯 Base64,ReturnDataUri 返回带 data: 前缀的完整格式
  4. GDI+ 初始化: 类内部自动管理 GDI+ 生命周期,首次使用时初始化,类销毁时释放
  5. 线程安全: VBMAN.Image 是全局共享实例,如需多个独立转换任务,应创建 New cImage

最佳实践

  1. 显示优先用 ShowTo: 比 Set Image1.Picture = ...ReturnPicture 更简洁
  2. 简写法: VBMAN.Image.(base64Str) 比完整写法更直观
  3. API 场景: 接收 Base64 图片 → ShowTo 显示;发送图片 → ReturnBase64 编码
  4. HTML 嵌入: 使用 ReturnDataUri 生成可直接嵌入的格式
  5. 格式确认: 上传图片时用 ReturnMimeType 获取类型,随请求一起发送
  6. 独立实例: 多线程或批量转换场景应 New cImage 创建独立实例

VB6及其LOGO版权为微软公司所有