【问题标题】:retrieve varbinary data c# to picturebox将 varbinary 数据 c# 检索到图片框
【发布时间】:2013-05-28 09:56:15
【问题描述】:

大家好,我的代码有问题,我将图像保存为 varbinary ok,但是我希望从文件上传中选择图像时,图像显示在图片框中,但我不断收到错误,这可能吗?我正在使用 c# 和 asp.net。我一直在搜索,但似乎无法让代码在我的源代码上运行。

using System;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Web.UI.WebControls;
using System.IO;
using System.Drawing;

public partial class Mensagem : System.Web.UI.Page
{           
    protected void BtnUploadClick(object sender, EventArgs e)
    {
        string filePath = Server.MapPath(upload1.FileName);
        string filename = Path.GetFileName(filePath);
        string ext = Path.GetExtension(upload1.PostedFile.FileName);
        Stream fs = upload1.PostedFile.InputStream;
        BinaryReader br = new BinaryReader(fs);
        Byte[] bytes = br.ReadBytes((Int32)fs.Length);
         string dt = DateTime.Now.ToString("MM/dd/yyyy hh:mm:ss");    

        SqlConnection conn = new SqlConnection("Data Source=Microsoft SQL Server (SqlClient);Server=NEVETS-LAPTOP\\NEVETS;Initial Catalog=Forum;uid=sa;pwd=sql;Connect Timeout=10;TrustServerCertificate=True ");
                conn.Open();

            SqlCommand sqlCommand = conn.CreateCommand();
            sqlCommand.CommandType = CommandType.StoredProcedure;
            sqlCommand.CommandText = "usp_inserirFicheiro";                
            sqlCommand.Parameters.AddWithValue("@nome", SqlDbType.VarChar).Value = filename;
            sqlCommand.Parameters.AddWithValue("@tamanho", SqlDbType.VarBinary).Value = bytes;
            sqlCommand.Parameters.AddWithValue("@formato", SqlDbType.VarChar).Value = ext;
            sqlCommand.Parameters.AddWithValue("@data", SqlDbType.DateTime).Value = dt;
            sqlCommand.Parameters.AddWithValue("@ficheiro", SqlDbType.VarBinary).Value = br;                            
            sqlCommand.ExecuteNonQuery();
            txtnome.Text = "sucesso";

            conn.Close();

    }


    protected void Button2_Click(object sender, EventArgs e)
    {
        //upload1.SaveAs(Server.MapPath("~/imgs/" + upload1.FileName).ToString());
        //pbficheiro.ImageUrl = @"~/imgs/" + upload1.FileName;


 Byte[] ba = new BinaryReader(upload1.PostedFile.InputStream).ReadBytes((Int32)upload1.PostedFile.InputStream.Length);
using (MemoryStream ms = new MemoryStream(ba, false))
{
    Image imgTmp = Image.FromStream(ms);
    Bitmap bm = new Bitmap(imgTmp.Width, imgTmp.Height);
    Graphics g = Graphics.FromImage(bm);
    g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
    g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
    g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
    Rectangle rect = new Rectangle(0, 0, imgTmp.Width, imgTmp.Height);
    g.DrawImage(imgTmp, rect, 0, 0, imgTmp.Width, imgTmp.Height, GraphicsUnit.Pixel);

    using (MemoryStream ms2 = new MemoryStream())
    {
        bm.Save(ms2, imgTmp.RawFormat);
          bm.Dispose();
          imgTmp.Dispose();
          if (WantAnImage)
              return Image.FromStream(ms2);
          else (WantBytes)
              ms2.ToArray();}
    }
}

}

【问题讨论】:

  • pbficheiro 是我的图片框,它不应该显示从 fileupload 加载的图像吗?

标签: c# sql picturebox varbinary


【解决方案1】:

如果错误与内存有关,则可能是因为该方法退出时图像数据正在与 Stream 对象一起处理。尝试将其捕获到中间 Bitmap 对象中,并将该 Bitmap 分配给 PictureBox 图像属性。

这是一个可能有帮助的链接:

Saving Image to MemoryStream- Generic GDI+ Error

最终,这是作为信息源引用的:

http://msdn.microsoft.com/en-us/library/z7ha67kw

编辑:

我不知道“upload1”是什么类型或它的范围,但假设它是一个本地对象,我想知道这种方法(这将是您调用检索字节 [] 或图像的方法) :

protected void Button2_Click(object sender, EventArgs e)
{
    //upload1.SaveAs(Server.MapPath("~/imgs/" + upload1.FileName).ToString());
    //pbficheiro.ImageUrl = @"~/imgs/" + upload1.FileName;

    Byte[] ba = new BinaryReader(upload1.PostedFile.InputStream).ReadBytes((Int32)upload1.PostedFile.InputStream.Length);
    using (MemoryStream ms = new MemoryStream(ba, false))
    {
        System.Drawing.Image imgTmp = System.Drawing.Image.FromStream(ms);
        Bitmap bm = new Bitmap(imgTmp.Width, imgTmp.Height);
        Graphics g = Graphics.FromImage(bm);
        g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
        g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
        g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
        Rectangle rect = new Rectangle(0, 0, imgTmp.Width, imgTmp.Height);
        g.DrawImage(imgTmp, rect, 0, 0, imgTmp.Width, imgTmp.Height, GraphicsUnit.Pixel);
                bm.Save(Server.MapPath("~/imgs/" + upload1.FileName).ToString());
                pbficheiro.ImageUrl = @"~/imgs/" + upload1.FileName;
    }
}

【讨论】:

  • 感谢您的回答,我想做的是这个受保护的 void Button2_Click(object sender, EventArgs e) { upload1.SaveAs(Server.MapPath("~/imgs/" + upload1.FileName) .ToString()); pbficheiro.ImageUrl = @"~/imgs/" + upload1.FileName;但无需在本地保存文件...希望您理解...
  • 那与您最初发布的代码有点不同。但是第一次尝试还不错,我只是担心记忆丢失了。而且它不需要本地保存(我的建议也没有)。您只需将该内存交给不会立即释放的东西,例如通过本地 Bitmap 对象或不依赖 MemoryStream 的类似构造传递它。
  • 感谢您的快速回答,我一直在尝试像您说的那样从内存中获取它,但我认为我没有做对......我的代码不断出错。不能隐式转换类型...有什么建议吗?
  • 这就是上传按钮,当我点击“浏览...”时,我指的是当我点击确定时,它会直接加载到图片框中,然后如果我想保存,我会点击上传.. . 我够清楚了吗?感谢您的帮助
  • 感谢您的帮助,我遇到了一个奇怪的错误:CS1525: Invalid expression term 'return'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多