C# 使用WPF将二进制文件检索回图像和数据库并保存到文件夹中

C# 使用WPF将二进制文件检索回图像和数据库并保存到文件夹中,c#,sql-server,wpf,image,linq,C#,Sql Server,Wpf,Image,Linq,我已经成功地将图像转换为二进制,并使用linq to sql WPF将其保存到数据库中,现在我想将其检索回图像格式,并将其保存到计算机中的特定文件夹中 我读过很多博客和文章,它们从数据库中检索图像二进制文件,然后将其显示到PictureBox中,我想做的是选择图像并使用linq to sql将其保存到特定文件夹 迄今为止我尝试上载图像的代码: private void Browse_Click(object sender, RoutedEventArgs e) {

我已经成功地将图像转换为二进制,并使用linq to sql WPF将其保存到数据库中,现在我想将其检索回图像格式,并将其保存到计算机中的特定文件夹中

我读过很多博客和文章,它们从数据库中检索图像二进制文件,然后将其显示到PictureBox中,我想做的是选择图像并使用linq to sql将其保存到特定文件夹

迄今为止我尝试上载图像的代码:

private void Browse_Click(object sender, RoutedEventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.DefaultExt = ".jpg";
            ofd.Filter = "Image File (.jpg) | *.jpg";

            Nullable<bool> result = ofd.ShowDialog();

            if(result == true)
            {
                string fileName = ofd.FileName;
                _txtFileName.Text = fileName;
            }
        }

        private void Upload_Click(object sender, RoutedEventArgs e)
        {
            using(ImageDataContext db=new ImageDataContext())
            {
                image_data img = new image_data();

                img.image = ConverImageToBinary(_txtFileName.Text);

                try
                {
                    db.image_datas.InsertOnSubmit(img);
                    db.SubmitChanges();

                    MessageBox.Show("Picture Upload Successfully", "Success", MessageBoxButton.OK, MessageBoxImage.Exclamation);
                }

                catch(Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
        }

        public static byte[] ConverImageToBinary(string convertedImage)
        {
            try
            {
                FileStream fs = new FileStream(convertedImage, FileMode.Open, FileAccess.Read);

                BinaryReader br = new BinaryReader(fs);

                byte[] image = br.ReadBytes((int)fs.Length);

                br.Close();

                fs.Close();

                return image;
            }

            catch(Exception ex)
            {
                throw ex;//MessageBox.Show(ex.Message, "error", MessageBoxButton.OK, MessageBoxImage.Exclamation);
            }
        }
private void Browse\u单击(对象发送者,路由目标)
{
OpenFileDialog ofd=新建OpenFileDialog();
ofd.DefaultExt=“.jpg”;
ofd.Filter=“图像文件(.jpg)|*.jpg”;
可为空的结果=ofd.ShowDialog();
如果(结果==真)
{
字符串文件名=ofd.fileName;
_Text=fileName;
}
}
私有无效上载\u单击(对象发送者,路由目标)
{
使用(ImageDataContext db=new ImageDataContext())
{
图像_数据img=新图像_数据();
img.image=对流到二进制(_txtFileName.Text);
尝试
{
db.image_数据插入提交(img);
db.SubmitChanges();
显示(“图片上传成功”,“成功”,MessageBoxButton.OK,MessageBoxImage.叹号);
}
捕获(例外情况除外)
{
MessageBox.Show(例如Message);
}
}
}
公共静态字节[]转换为二进制(字符串转换图像)
{
尝试
{
FileStream fs=新的FileStream(convertedImage,FileMode.Open,FileAccess.Read);
BinaryReader br=新的BinaryReader(fs);
byte[]image=br.ReadBytes((int)fs.Length);
br.Close();
fs.Close();
返回图像;
}
捕获(例外情况除外)
{
throw ex;//MessageBox.Show(例如Message,“error”,MessageBoxButton.OK,MessageBoxImage.感叹号);
}
}

读取图像的第一个代码非常复杂,您将其作为流打开,并读取所有字节。有一种方法可以做到这一点,所以你可以用

img.image = File.ReadAllBytes(_txtFileName.Text);
此外,您从未将任何内容“转换”为任何内容,图像只是磁盘上的一个字节数组,您已经读取了它,并将其保存到数据库中,如果您将其读回并保存回(使用此时间文件.writealBytes),它将正常工作,因此

如果要写入磁盘,只需将映像按如下方式保存回磁盘:

File.WriteAllBytes(@"d:\myfile.bmp",img.Image.ToArray()) ;

并确保更改扩展名以匹配您的文件类型(因此bmp表示位图jpg表示jpeg等)

请注意,问题是关于WPF的。虽然在问题中提到,但WPF中没有PictureBox。您可以从本地文件URI或MemoryStream加载BitmapImage,并将其放入图像控件中。当然也有很多关于StackOverflow的答案,说明了如何做到这一点。这取决于他的意思,他可能会在wpf中主持一个picturebox(winform),尽管我对此表示怀疑it@RonanThibaudau.... 我曾使用过“File.writealBytes(@“d:\”,img.Image)”;“但即使将其转换为int和binary,它仍会返回异常,但仍会引发异常”无法将“System.Data.Linq.binary”类型的对象强制转换为“System.IConvertible”类型”@克莱门斯…亲爱的,实际上我的问题是将图像保存回文件夹是的,我知道图像控件用于在WPF中显示图像…我感谢你的帮助..而且File.writealBytes永远无法按你所说的方式工作,你只是告诉它保存到d:\这是一个文件夹,不是一个文件,它需要一个文件名!