如何使用WPF将图像插入数据库

时间:2010-02-25 12:07:41

标签: sql wpf image insert

我有一个WPF问题。

我在WPF表单中有2个文本框和一个图像控件。 图像控件中有图像。

我想在SQL数据库的3个单独的列中插入每个文本框和图像的内容。 文本框将输入varchar列,而图像本身将加载到具有数据类型图像的列中。

我该怎么做?

由于

5 个答案:

答案 0 :(得分:4)

我们这样做的方法是将图像作为blob存储在数据库中(它们是相当小的图像,4-500k,因此将它们存储在db中不应该导致任何性能问题),将它们作为字节数组进行检索,然后使用ValueConverterbyte[]转换为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)

我不确定图像字段类型的工作原理,但是,这可能很有用:

Image UriSource and Data Binding

换句话说,您可能需要使用值转换器将db格式转换为演示文稿(WPF)格式。

答案 4 :(得分:0)

如果你想处理BitmapSource图像,包括图像源不是文件的情况,那么我建议copying the pixels' buffer into an array,然后存储数组+ pixelformat和维度元数据(数组和元数据可用于{{ 3}})。