从数据库中读取图片显示到了picturebox里面
相关代码如下:
if (dr.Read())
            {
                MemoryStream ms=new MemoryStream((byte[])dr["Photo"]);
                Image img = Image.FromStream(ms,true );                
                picPhoto.Image = img;                           }
能够正确的显示出图片
然后可以执行单击picturebox进行选择图片,替换原来的图片然后保存到数据库
相关代码如下private void picPhoto_Click(object sender, EventArgs e)
        {
            OpenFileDialog fs = new OpenFileDialog();
            fs.Filter = "Image Files(*.BMP;*.JPG;*.GIF)|*.BMP;*.JPG;*.GIF";
            //如果用户选择了文件就设置文件路径
            if (fs.ShowDialog() == DialogResult.OK)
            {
                picPhoto.ImageLocation = fs.FileName;
            }
        }以下是保存图片的部分代码,开始不能正确的保存            System.IO.MemoryStream ms = new System.IO.MemoryStream();
            picPhoto.Image.Save(ms, picPhoto.Image.RawFormat);
            byte[] picByte=new byte[ Convert.ToInt32(ms.Length)];
            ms.Read(picByte, 0,Convert.ToInt32( ms.Length));
用写到文件的代码测试
System.IO.MemoryStream ms = new System.IO.MemoryStream();            
picPhoto.Image.Save(System.Environment.CurrentDirectory +@"\temp.jpg",picPhoto.Image.RawFormat);
如果程序一开始,也就是读出并显示到picturebox里面的时候,直接运行保存代码(用写到文件的代码替换写道数据库的代码),可以生成正确的和picturebox里面一样的temp.jpg文件
如果picturebox进行了单击,并选择了图片,那么不能生产temp.jpg文件
如果单击,不选择图片,直接显示了图片以后直接保存
也不能正确的保存到数据库里面
哪里出问题了,大家帮忙看看
谢谢!

解决方案 »

  1.   

    /// <summary>
            /// 将图片转换成二进制流
            /// </summary>
            /// <param name="path"></param>
            /// <returns></returns>
            public byte[] InsertImageSQL(string path)
            {
                byte[] img;
                if (!File.Exists(path))
                    return null;
                FileStream fs = File.OpenRead(path);
                img = new byte[fs.Length];
                fs.Read(img, 0, Convert.ToInt32(fs.Length));
                fs.Close();
                return img;
            }        /// <summary>
            /// 将Image转换成二进制流
            /// </summary>
            /// <param name="image"></param>
            /// <returns></returns>
            public byte[] InsertImageSQL(Image image)
            {
                MemoryStream ms = new MemoryStream();
                image.Save(ms, ImageFormat.Jpeg);
                byte[] img = new byte[ms.Length];
                ms.Position = 0;
                ms.Read(img, 0, Convert.ToInt32(ms.Length));
                ms.Close();
                return img;
            }        /// <summary>
            /// 从数据库中将二进制解析为Image
            /// </summary>
            /// <param name="img"></param>
            /// <returns></returns>
            public Image GetImageSQL(byte[] img)
            {
                MemoryStream ms = new MemoryStream(img);
                return Image.FromStream(ms);
            }
      

  2.   

    picPhoto.ImageLocation = fs.FileName; 
    调用这个之后,要调用
    picPhoto.Load();
      

  3.   

    我在VS2005下试验了picPhoto.ImageLocation = fs.FileName; System.IO.MemoryStream ms = new System.IO.MemoryStream(); 
    picPhoto.Image.Save(ms, picPhoto.Image.RawFormat); 
    byte[] picByte=new byte[ Convert.ToInt32(ms.Length)]; 
    ms.Read(picByte, 0,Convert.ToInt32( ms.Length)); 显示正常,picByte读取数据也正常
      

  4.   

    2:cpio 
    我也在vs2005下读取,并保存到数据库没有问题保存到数据库
    然后再另一个窗口
    读出来,并显示也没有问题问题是出在
    我要做的是
    从数据库读出来显示以后
    如果用户单击picturebox改变了图片,然后把改变了的图片再保存到数据中替换原来的图片的时候就出这样的错误了
      

  5.   

    终于搞定了一句话造成的
    ms.Position = 0; 害得我好苦
    也是我不够细心