C# 在wpf应用程序中从数据库检索图像
我有一个简单的应用程序,它包含一个C# 在wpf应用程序中从数据库检索图像,c#,.net,sql-server,wpf,xaml,C#,.net,Sql Server,Wpf,Xaml,我有一个简单的应用程序,它包含一个登录窗口和另一个名为主体的窗口。在我的SQL Server数据库中有一个tbl_用户,具有以下列: pmk\u int\u用户 name\u str\u user user\u str\u user pass\u str\u user photo\u img\u用户 键入图像 在我的主要WPF Xaml中: <Grid> <Image HorizontalAlignment="Left" Height="71" Margin
登录
窗口和另一个名为主体
的窗口。在我的SQL Server数据库中有一个tbl_用户
,具有以下列:
pmk\u int\u用户
name\u str\u user
user\u str\u user
pass\u str\u user
photo\u img\u用户
键入图像
<Grid>
<Image HorizontalAlignment="Left" Height="71" Margin="10,10,0,0" VerticalAlignment="Top" Width="87" Name="Photo"/>
</Grid>
但当我单击并使用有效的用户和密码登录时,它会显示一个无效的参数。当我评论此代码时:
MemoryStream strm = new MemoryStream(_photo);
System.Drawing.Image img = System.Drawing.Image.FromStream(strm);
BitmapImage bi = new BitmapImage();
bi.BeginInit();
MemoryStream ms = new MemoryStream();
img.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);
ms.Seek(0, SeekOrigin.Begin);
bi.StreamSource = ms;
bi.EndInit();
p.Photo.Source = bi;
此代码仅用于打开文件对话框以选择图像:
private void btnAddFoto(object sender, RoutedEventArgs e)
{
OpenFileDialog _fd = new OpenFileDialog();
byte[] dadosImagem = null;
if (_fd.ShowDialog() == true)
{
try
{
_fs = new FileStream(_fd.FileName, FileMode.Open, FileAccess.Read);
dadosImagem = new byte[_fs.Length];
_fs.Read(dadosImagem, 0, System.Convert.ToInt32(_fs.Length));
_fs.Close();
ImageSourceConverter imgs = new ImageSourceConverter();
imgPessoa.SetValue(Image.SourceProperty, imgs.ConvertFromString(_fd.FileName.ToString()));
}
catch (Exception ex)
{
MessageBox.Show("Erro :: " + ex.Message);
}
}
这是为了转换:
private byte[] BitmapSourceToByteArray(BitmapSource image)
{
using (var stream = new MemoryStream())
{
var encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(image));
encoder.Save(stream);
return stream.ToArray();
}
}
这是从图像控件获取图像并保存在数据库中:
var foto_img_pessoa = BitmapSourceToByteArray((BitmapSource)imgPessoa.Source);
它可以工作,但我的图像不会显示在我的Principal
窗口中。这段代码有什么问题?
我的错误消息异常是:<代码> { Stry.AgMuthExtExp:PAR } Metro IVA.LIDO.EM系统。绘图。FromStream(流,布尔使用嵌入颜色管理,布尔验证IMALDEDATA)EM系统。绘制。图像。FromStream(流)你能逐行检查代码吗?哪一行给出了错误?我也不确定你为什么不使用从数据库获得的流初始化位图。你不需要保存位图,然后从另一行加载图像。数据库中保存了什么类型的图像?你确定它有效吗?@mageos I add I通过此方法进行图像处理o
private void btnAddPhoto(对象发送方,RoutedEventArgs e){u fs=new FileStream(_fd.FileName,FileMode.Open,FileAccess.Read);img=new byte[_fs.Length];_fs.Read(img,0,System.Convert.ToInt32(_fs.Length));_fs.Close();ImageSourceConverter imgs=new ImageSourceConverter();imgUser.SetValue(Image.SourceProperty,imgs.ConvertFromString(_fd.FileName.ToString());}}
之后,我将其二进制图像保存到数据库中;我现在的问题是如何从数据库中检索它。@mageos我的错误行是System.Drawing.Image img=System.Drawing.Image.FromStream(strm)代码>当我在这一行中调试的是pointas error和pass to catch(Exception ex)时,我会仔细检查数据库中的数据。我一直使用相同的方法将字节[]转换为图像。我猜数据库中的数据已损坏。你确认过照片有价值吗。查看代码,您可能也有一个typeo。尝试在MemoryStream中使用_photo而不是_photo
private byte[] BitmapSourceToByteArray(BitmapSource image)
{
using (var stream = new MemoryStream())
{
var encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(image));
encoder.Save(stream);
return stream.ToArray();
}
}
var foto_img_pessoa = BitmapSourceToByteArray((BitmapSource)imgPessoa.Source);