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

PNG/JPG转TIFF后内存流未更新问题求助

问题分析与解决

你的转换逻辑方向是对的,但内存流操作的细节没处理到位,导致lMS始终保留原图像数据,问题出在这两点:

  • lTiffMS.Save执行后,它的读写指针(Position)停在流的末尾,直接调用CopyTo时不会读取到任何有效内容。
  • 原lMS的内容未被清空,且它的指针位置可能也不在起始处,最终ToArray()取到的还是最初的PNG/JPG数据。

修正后的代码

' If png or jpeg, then convert to Tiff
If aFName.ToUpper.EndsWith(".PNG") OrElse aFName.ToUpper.EndsWith(".JPG") OrElse aFName.ToUpper.EndsWith(".JPEG") Then
    Try
        Using lTiffMS As New MemoryStream
            ' 从lMS读取原图像并保存为TIFF格式到lTiffMS
            System.Drawing.Image.FromStream(lMS).Save(lTiffMS, System.Drawing.Imaging.ImageFormat.Tiff)
            
            ' 重置lTiffMS的指针到流开头,确保能读取完整的TIFF数据
            lTiffMS.Position = 0
            
            ' 清空原lMS的旧内容并重置指针到起始位置
            lMS.SetLength(0)
            lMS.Position = 0
            
            ' 将TIFF数据复制到lMS
            lTiffMS.CopyTo(lMS)
            
            ' 重置lMS指针到开头,保证后续ToArray能读取完整的TIFF内容
            lMS.Position = 0
            
            aFName = Path.GetFileNameWithoutExtension(aFName) + ".tiff"
        End Using
    Catch ex As Exception
        Common.LogMessage("SAPInterface.GetBase64-Tiff", ex.ToString)
        Return Nothing
    End Try
End If

Return Convert.ToBase64String(lMS.ToArray())

关键修正点说明

  • 用Using语句管理lTiffMS,确保内存流使用后被正确释放,避免内存泄漏。
  • 所有流操作前必须重置Position为0,否则读写会从当前指针位置开始,导致数据读取不全或写入错误。
  • 通过lMS.SetLength(0)清空原流的旧内容,彻底替换为新的TIFF数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 21:35:03