You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VBA中保存前如何获取WIA图像对象的磁盘文件大小

计算公式不匹配的原因

你查到的公式计算的是未压缩原始像素数据的理论大小,仅能对应无压缩BMP格式的像素区体积,和实际落盘文件大小不匹配是正常情况:

  • PNG为无损压缩格式、JPG为有损压缩格式,最终文件体积由图像内容复杂度、编码参数(如JPG质量等级)共同决定,不存在可以仅通过宽高、位深直接计算最终体积的固定公式
  • 即便是无压缩BMP格式,实际文件还要包含文件头、调色板(低位深场景)等额外字节,直接用像素尺寸乘位深计算也会和实际大小有偏差
不落盘获取准确文件大小的实现方案

不需要写入临时文件再删除,WIA库本身已经提供了内存级的获取方式:处理完滤镜后,直接读取输出图像对象的FileData属性的长度即可,该值和实际调用SaveFile方法写入磁盘的文件大小完全一致,全程无磁盘IO操作。

实现步骤

  • 完成原有WIA.ImageProcess滤镜配置,执行Apply方法拿到处理后的WIA.ImageFile对象
  • 提前指定好最终输出的文件格式(PNG/JPG/BMP等),如果是JPG格式同步配置好压缩质量参数
  • 直接读取ImageFile.FileData.Size属性,返回值就是对应格式保存后的准确字节数,和Windows资源管理器显示的文件属性大小无偏差

示例代码

' 已完成原始图像对象originalImg的加载
Dim imgProc As WIA.ImageProcess
Dim processedImg As WIA.ImageFile
Dim finalFileSizeBytes As Long
Dim finalFileSizeKB As Double, finalFileSizeMB As Double

Set imgProc = New WIA.ImageProcess
' 以下为示例滤镜配置,替换为你实际使用的滤镜逻辑即可
imgProc.Filters.Add imgProc.FilterInfos("Scale").FilterID
imgProc.Filters(1).Properties("MaximumWidth") = 1920
imgProc.Filters(1).Properties("MaximumHeight") = 1080

' 执行滤镜处理
Set processedImg = imgProc.Apply(originalImg)

' 指定最终输出格式,此处以PNG为例,可替换为wiaFormatJPEG等其他格式常量
processedImg.FormatID = wiaFormatPNG
' 读取准确文件大小
finalFileSizeBytes = processedImg.FileData.Size

' 按需换算单位
finalFileSizeKB = finalFileSizeBytes / 1024
finalFileSizeMB = finalFileSizeKB / 1024
方案说明
  • FileData属性存储的就是SaveFile方法写入磁盘的完整字节流,包含文件头、压缩后图像数据、元数据等全部内容,不存在大小偏差
  • 全程操作在内存中完成,相比临时文件方案性能更高,也不会出现临时文件占用、删除失败、权限不足等问题
  • 如果输出JPG格式,需要在处理滤镜阶段提前配置好JPG质量参数,FileData.Size会自动匹配对应质量下的压缩后文件大小

内容的提问来源于stack exchange,提问作者kl kl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 20:45:36