WPF

2010-02-25 13 views
5

का उपयोग कर किसी डेटाबेस में छवि को सम्मिलित करने के लिए मेरे पास एक WPF प्रश्न है।WPF

मेरे पास एक WPF फॉर्म में 2 टेक्स्टबॉक्स और छवि नियंत्रण है। छवि नियंत्रण में एक छवि है।

मैं SQL डेटाबेस में 3 अलग-अलग कॉलम में प्रत्येक टेक्स्ट बॉक्स और छवि की सामग्री डालना चाहता हूं। टेक्स्ट बॉक्स वर्चर्स कॉलम में फ़ीड करते हैं जबकि छवि को डेटाटाइप छवि वाले कॉलम में लोड किया जाता है।

मैं यह कैसे कर सकता हूं?

धन्यवाद

+0

अच्छा सवाल के पीछे! :) –

+2

खराब सवाल। डब्ल्यूपीएफ सामान डीबी सामान से अलग किया जाना चाहिए। – arconaut

उत्तर

0

मेकअप 2 टेबल, पहली तालिका textbox1 के पाठ शामिल [शायद "नाम"], TextBox2 के पाठ [हो सकता है "उपनाम"] और imageId [], एक और तालिका फ़ाइल id, filebytes और फ़ाइल extentions.when शामिल आप उपरोक्त जानकारी को तस्वीर के साथ सहेजते हैं। छवि और विस्तार के बाइट्स ले लो इसे बचाओ। जब आप छवि कहीं दिखाने के लिए inorder मिलता है, आप 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);} 
+0

इसके लिए धन्यवाद ... यह सही दिशा में एक कदम है .. क्या कोई उदाहरण हैं जहां मैं ऐसा करने के लिए WPF डेटा बाइंडिंग का उपयोग कर सकता हूं? मैं उपर्युक्त परिदृश्य में फ़ील्ड स्तर सत्यापन त्रुटियों का प्रबंधन कैसे करूं? मैं डेटाबेस के रूप में SQL कॉम्पैक्ट का उपयोग कर रहा हूं। जो मैं देखता हूं उससे मुझे डेटा नियंत्रण में प्रत्येक नियंत्रण की सामग्री को मैन्युअल रूप से मैप करना होगा, संभवतः विधि SaveToDB में। क्या मेरे उद्देश्य को प्राप्त करने के लिए संभवतः संग्रहदृश्य स्रोत या LINQ TO SQL का उपयोग करने के लिए कोई अन्य स्वच्छता या क्लीनर तरीका है? धन्यवाद – femi

+0

शायद यह यूआरएल आपके लिए अच्छा होगा http://www.aneef.net/2009/01/16/uploading-binary-files-or-images-using-linq-to-sql/ – ibrahimyilmaz

0

मुझे यकीन है कि कैसे छवि फ़ील्ड प्रकार काम करता है नहीं कर रहा हूँ, हालांकि, इस उपयोगी हो सकता है:

Image UriSource and Data Binding

दूसरे शब्दों में, आप के लिए/परिवर्तित करने के लिए अपने डाटाबेस प्रारूप से करने के लिए एक मूल्य कनवर्टर का उपयोग करना पड़ सकता है आपके प्रस्तुति (डब्ल्यूपीएफ) प्रारूप।

0

आप जिन मामलों में छवियों 'सूत्रों फ़ाइलें नहीं होतीं सहित BitmapSource छवियों को संभालने के लिए चाहते हैं, तो मैं copying the pixels' buffer into an array की सलाह देते हैं, तो सरणी + pixelformat और आयाम मेटाडाटा (सरणी और मेटाडाटा recreate the image लिए इस्तेमाल किया जा सकता) भंडारण।

3

हम जिस तरह से करते हैं वह छवियों को डेटाबेस में ब्लॉब्स के रूप में स्टोर करना है (वे काफी छोटी छवियां हैं, 4-500k, इसलिए उन्हें डीबी में संग्रहीत करना किसी भी परेशानी की समस्या नहीं पैदा करना चाहिए), उन्हें बाइट के रूप में पुनः प्राप्त करें सरणी, और फिर byte[] से BitMap में कनवर्ट करने के लिए ValueConverter का उपयोग करें। छवि नियंत्रण के लिए 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

डब्ल्यूपीएफ में लिंक से एसक्यूएल का उपयोग कर डेटाबेस में छवियों को स्टोर/पुनर्प्राप्त करने का तरीका नीचे।

डाटाबेस

यह अलग तालिकाओं में छवियों को स्टोर करने की सिफारिश की है। तालिका जहां अपनी छवियों को स्टोर करने के लिए,

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 एसक्यूएल का उपयोग कर

दृश्य स्टूडियो में प्रकार LINQ to SQL Classes (.dbml) का एक नया आइटम जोड़ने और इसे MyDataContext फोन की सुविधा देता है। वीएस में सर्वर एक्सप्लोरर का उपयोग करें, अपने डेटाबेस से कनेक्ट करें और .dbml डिज़ाइन क्षेत्र में अपनी छवियों की तालिका UploadedImage खींचें। MyDataContext फ़ाइल Ctrl + एस सहेजें।

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)); 
    } 
} 
संबंधित मुद्दे