我有一個WPF問題的數據庫。如何將圖片插入使用WPF
我有2個文本框和在WPF形成圖像的控制。 圖像控件中有一個圖像。
我想插入每個文本框在3個單獨列的內容和圖像中的SQL數據庫。 將圖像本身加載到具有數據類型圖像的列中時,將文本框輸入到varchar列中。
我該怎麼做?
感謝
我有一個WPF問題的數據庫。如何將圖片插入使用WPF
我有2個文本框和在WPF形成圖像的控制。 圖像控件中有一個圖像。
我想插入每個文本框在3個單獨列的內容和圖像中的SQL數據庫。 將圖像本身加載到具有數據類型圖像的列中時,將文本框輸入到varchar列中。
我該怎麼做?
感謝
化妝2表,第一個表包含TextBox1中的文字[也許 「名」],TextBox2中的文本[也許 「姓」]和圖像標識[],另一個表中包含文件ID,filebytes和文件extentions.when你用圖片保存上述信息。採取圖像的字節和擴展保存此。當你得到的圖像序某處顯示,你翻譯字節在這裏ASP.NET通過及其延伸的文件 http://www.beansoftware.com/ASP.NET-Tutorials/Save-Read-Image-Database.aspx 但控制一般都在.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);}
感謝這...它在正確的方向邁出的一步.. 是否有任何例子,我可以使用WPF數據綁定來做到這一點?我如何管理上述場景中的現場級驗證錯誤? 我正在使用SQL Compact作爲數據庫。 從我看到我必須manually地將每個控件的內容映射到數據庫,可能在SaveToDB方法中。 是否有任何其他整潔或更清潔的方式來實現我的目標,可能使用collectionviewsource或LINQ TO SQL? 謝謝 – femi
也許這個網址會對你有好處http://www.aneef.net/2009/01/16/uploading-binary-files-or-images-using-linq-to-sql/ – ibrahimyilmaz
我不知道像字段類型是如何工作的,不過,這可能是有用的:
Image UriSource and Data Binding
換句話說,你可能需要使用值轉換器轉換到/從你的數據庫格式,以您的演示文稿(WPF)格式。
如果你要處理的BitmapSource圖像,包括其中的圖像來源不是文件的情況下,那麼我建議copying the pixels' buffer into an array,然後存儲陣列+像素格式和尺寸的元數據(數組和元數據可以使用到recreate the image)。
我們這樣做是爲了存儲圖像的數據庫中的斑點的方式(他們是相當小的圖像,4-500k,所以將它們存儲在數據庫中應該不會引起任何問題PERF),retreive他們爲字節數組,然後用ValueConverter
轉換從byte[]
到BitMap
。 的圖像控制的XAML看起來像這樣:
<Image Source="{Binding Path=RawImageData,
Converter={StaticResource ByteArrayToBitmapImageConverter},
Mode=OneWay}" />
我們在視圖模型綁定到該屬性是一個簡單的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();
}
}
下面介紹如何使用WPF中的Linq to SQL在數據庫中存儲/檢索圖像。
數據庫
我們推薦將圖像存儲在不同的表。 使用LINQ 2 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]
數據訪問層
在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));
}
}
有趣的問題! :) –
不好的問題。 WPF的東西應該從數據庫中分離出來。 – arconaut