使用XImage.FromStream读取数据库图片字节数组报‘参数无效’求助
解决XImage.FromStream读取数据库字节数组报错“参数无效”的问题
可能的原因及修复步骤:
- 流位置未重置
虽然new MemoryStream(byteArray)默认Position为0,但特殊场景下可能出现位置偏移。调用XImage.FromStream前手动重置流位置:
using (var stream = new MemoryStream(byteArray)) { stream.Position = 0; // 确保流从起始位置读取 image2 = XImage.FromStream(stream); // 在这里执行image2的绘制操作 gfx.DrawImage(image2, ...); }
- 流提前被释放
你当前代码中image2在using块外声明,但流会在using块结束后立即Dispose。若后续要使用image2,必须保证流在image2生命周期内保持打开,建议把image2的使用逻辑放在using块内部:
using (var stream = new MemoryStream(byteArray)) { using (XImage image2 = XImage.FromStream(stream)) { gfx.DrawImage(image2, 100, 100, 200, 200); // 按需调整绘制位置与尺寸 } }
- 验证字节数组完整性
先把读取到的字节数组保存为本地文件,确认图片本身有效:
byte[] byteArray = (byte[])dr["Image"]; File.WriteAllBytes(@"C:\test_image.jpg", byteArray);
如果本地文件能正常打开,说明字节数组没问题,问题出在XImage的使用逻辑;如果打不开,排查数据库存储环节是否有差异(比如其他模块存储时是否做了格式转换)。
- 检查iTextSharp版本一致性
不同版本的iTextSharp对XImage.FromStream的实现可能存在差异,确认当前项目使用的版本和其他正常模块一致。
修正后的完整代码示例:
connectionString(); con.Open(); com.Connection = con; com.CommandText = "SELECT TOP(1) [Image] FROM dbo.recovery_job_images WHERE [JobNo] = '21802' AND [ImageName] = 'DAMAGE IMAGE'"; dr = com.ExecuteReader(); while (dr.Read()) { byte[] byteArray = (byte[])dr["Image"]; // 可选:验证字节数组有效性 File.WriteAllBytes(@"C:\test_damage.jpg", byteArray); using (var stream = new MemoryStream(byteArray)) { stream.Position = 0; using (XImage image2 = XImage.FromStream(stream)) { gfx.DrawImage(image2, 100, 100, 300, 200); } } XImage image = XImage.FromFile("_Logo.png"); gfx.DrawImage(image, 400, 20, 140, 74); pdfDoc.Save(filename); }
内容的提问来源于stack exchange,提问作者TryingAgain
相关产品推荐
相关产品推荐

