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
相关产品推荐
相关产品推荐

