我有一个WPF问题。
我在WPF表单中有2个文本框和一个图像控件。 图像控件中有图像。
我想在SQL数据库的3个单独的列中插入每个文本框和图像的内容。 文本框将输入varchar列,而图像本身将加载到具有数据类型图像的列中。
我该怎么做?
由于
答案 0 :(得分:4)
我们这样做的方法是将图像作为blob存储在数据库中(它们是相当小的图像,4-500k,因此将它们存储在db中不应该导致任何性能问题),将它们作为字节数组进行检索,然后使用ValueConverter
将byte[]
转换为BitMap
。
图像控件的XAML如下所示:
<Image Source="{Binding Path=RawImageData,
Converter={StaticResource ByteArrayToBitmapImageConverter},
Mode=OneWay}" />
我们在ViewModel中绑定的属性就像这样byte[]
;
private byte[] _rawImageData;
public byte[] RawImageData
{
get { return _rawImageData; }
set
{
if (value != _rawImageData)
{
_rawImageData = value;
NotifyPropertyChanged("RawImageData");
}
}
}
然后ValueConverte
看起来像这样;
public class ByteArrayToBitmapImageConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var rawImageData = value as byte[];
if (rawImageData == null)
return null;
var bitmapImage = new System.Windows.Media.Imaging.BitmapImage();
using (var stream = new MemoryStream(rawImageData))
{
bitmapImage.BeginInit();
bitmapImage.CreateOptions = BitmapCreateOptions.PreservePixelFormat;
bitmapImage.CacheOption = BitmapCacheOption.Default;
bitmapImage.StreamSource = stream;
bitmapImage.EndInit();
}
return bitmapImage;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
答案 1 :(得分:1)
下面介绍如何在WPF中使用Linq to SQL在数据库中存储/检索图像。
<强>数据库强>
建议将图像存储在单独的表中。 创建用于存储图像的表格,
CREATE TABLE UploadedImage(
[ImageID] [int] IDENTITY(1,1) NOT NULL,
[ImageName] [varchar](100) NOT NULL,
[ImageContent] [image] NOT NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
使用Linq 2 SQL的数据访问层
在Visual Studio中添加LINQ to SQL Classes
(.dbml
)类型的新项目,并将其称为MyDataContext
。
在VS中使用服务器资源管理器,连接到您的数据库并将图像表UploadedImage
拖到.dbml
设计区域。保存MyDataContext
文件 Ctrl + S 。
<强> XAML 强>
<TextBox x:Name="ImagePath" />
<Button x:Name="BrowseButton" Content="..." Click="BrowseButton_OnClick"/>
<Button x:Name="SaveButton" Content="Save" Click="SaveButton_OnClick"/>
<Button x:Name="LoadButton" Content="Load" Click="LoadButton_OnClick" />
<Image x:Name="MyImage" >
<Image.Source>
<BitmapImage UriSource="{Binding ElementName=ImagePath, Path=Text}" />
</Image.Source>
</Image>
代码
private byte[] _imageBytes = null;
// Browse for an image on your computer
private void BrowseButton_OnClick(object sender, RoutedEventArgs e)
{
var dialog = new OpenFileDialog
{
CheckFileExists = true,
Multiselect = false,
Filter = "Images (*.jpg,*.png)|*.jpg;*.png|All Files(*.*)|*.*"
};
if (dialog.ShowDialog() != true) { return; }
ImagePath.Text = dialog.FileName;
MyImage.Source = new BitmapImage(new Uri(lImagePath.Text));
using (var fs = new FileStream(ImagePath.Text, FileMode.Open, FileAccess.Read))
{
_imageBytes = new byte[fs.Length];
fs.Read(imgBytes, 0, System.Convert.ToInt32(fs.Length));
}
}
// Save the selected image to your database
private void SaveButton_OnClick(object sender, RoutedEventArgs e)
{
if (!String.IsNullOrEmpty(ImagePath.Text))
{
var db = new MyDataContext();
var uploadedImg = new UploadedImage
{
ImageID = 0,
ImageContent = _imageBytes,
ImageName = ImagePath.Text
};
db.UploadedImages.InsertOnSubmit(uploadedImg);
db.SubmitChanges();
}
}
// Load an image from the database
private void LoadButton_OnClick(object sender, RoutedEventArgs e)
{
// Load 1 image from the database and display it
var db = new ImageInDatabaseDataContext();
var img = (from el in db.UploadedImages
select el).FirstOrDefault();
if (img != null)
{
// Display the loaded image
ImageFile.Source = new BitmapImage(new Uri(img.ImageName));
}
}
答案 2 :(得分:0)
制作2个表,第一个表包含textbox1的文本[可能是“name”],textbox2的文本[可能是“surname”]和imageId [],另一个表包含文件id,filebytes和文件扩展名。当你保存上述信息时图片。取字节图像和扩展保存。当你得到图像以便显示某个地方时,你通过它的扩展将字节翻译成文件 http://www.beansoftware.com/ASP.NET-Tutorials/Save-Read-Image-Database.aspx 在这里用于ASP.NET,但控件在.net。(textbox.Text等)中通常是相同的。
private void Button1_Click(object sender, System.EventArgs e)
{
Stream img_strm = upload_file.PostedFile.InputStream;
//Retrieving the length of the file to upload
int img_len = upload_file.PostedFile.ContentLength;
//retrieving the type of the file to upload
string strtype = upload_file.PostedFile.ContentType.ToString();
string strname = txtimgname.Text.ToString();
byte[] imgdata = new byte[img_len];
int n = img_strm.Read(imgdata, 0, img_len);
int result = SaveToDB(strname, imgdata, strtype);}
答案 3 :(得分:0)
答案 4 :(得分:0)
如果你想处理BitmapSource图像,包括图像源不是文件的情况,那么我建议copying the pixels' buffer into an array,然后存储数组+ pixelformat和维度元数据(数组和元数据可用于{{ 3}})。