如何将System.Drawing.Image创建的Bitmap重新保存为Base64字符串?
解决Bitmap转Base64嵌入HTML邮件的问题
你遇到的核心问题出在注释代码的两处错误:
System.Drawing.Imaging.ImageFormat.ToString()是错误用法,必须传入具体的ImageFormat枚举值(比如[System.Drawing.Imaging.ImageFormat]::Png),ToString()返回的是类型名称,不是枚举实例,会导致Save方法调用失败。- 把Bitmap保存到MemoryStream后,没有将流的
Position重置为0,[Convert]::ToBase64String会从流的末尾开始读取,最终得到空字符串。
另外,无参数创建MemoryStream在PowerShell里是合法的,之前的报错大概率是ImageFormat参数错误引发的连带问题。
修正后的完整代码如下,替换你原来的注释部分即可:
# 创建空内存流 $ImageBytesMemoryStream = New-Object IO.MemoryStream # 使用具体的图像格式枚举值保存Bitmap(这里以PNG为例,可按需换成Jpeg等) $NewBitmap.Save($ImageBytesMemoryStream, [System.Drawing.Imaging.ImageFormat]::Png) # 将流的读取位置重置到起始点 $ImageBytesMemoryStream.Position = 0 # 转换为Base64字符串 $ImageBase64 = [Convert]::ToBase64String($ImageBytesMemoryStream.ToArray()) # 释放流资源(可选,PowerShell会自动回收,但显式释放更规范) $ImageBytesMemoryStream.Dispose()
补充说明:
- 嵌入HTML邮件时,需要给Base64字符串加上对应的前缀,比如
data:image/png;base64,$ImageBase64,这样邮件客户端才能正确识别显示图片。 - 确保在完成Base64转换后再处理
$NewBitmap的释放,避免资源提前回收导致报错。
内容的提问来源于stack exchange,提问作者user66001
相关产品推荐
相关产品推荐

