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

使用XImage.FromStream读取数据库图片字节数组报‘参数无效’求助

解决XImage.FromStream读取数据库字节数组报错“参数无效”的问题

可能的原因及修复步骤:

  1. 流位置未重置
    虽然new MemoryStream(byteArray)默认Position为0,但特殊场景下可能出现位置偏移。调用XImage.FromStream前手动重置流位置:
using (var stream = new MemoryStream(byteArray))
{
    stream.Position = 0; // 确保流从起始位置读取
    image2 = XImage.FromStream(stream);
    // 在这里执行image2的绘制操作
    gfx.DrawImage(image2, ...);
}
  1. 流提前被释放
    你当前代码中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); // 按需调整绘制位置与尺寸
    }
}
  1. 验证字节数组完整性
    先把读取到的字节数组保存为本地文件,确认图片本身有效:
byte[] byteArray = (byte[])dr["Image"];
File.WriteAllBytes(@"C:\test_image.jpg", byteArray);

如果本地文件能正常打开,说明字节数组没问题,问题出在XImage的使用逻辑;如果打不开,排查数据库存储环节是否有差异(比如其他模块存储时是否做了格式转换)。

  1. 检查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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 07:40:24