C# WPF Kép mentése/betöltése adtbázisba/ból

C# WPF Kép mentése/betöltése adtbázisba/ból
2014-04-17T10:38:54+02:00
2014-04-24T09:53:47+02:00
2022-11-30T23:41:56+01:00
anonymus0402
Képet szeretnék menteni adatbázisba, majd onnan megnyitni. A mentés elméletileg jó, mert az adatbázisba betölti hexadecimáliskód formában, de visszaolvasni már nem tudja.

public class Adat { public BitmapImage Kep { get; set; } public string SourceUri { get { return GetApplicationFolder() + Kep; } } private string GetApplicationFolder() { return AppDomain.CurrentDomain.BaseDirectory; } } private BitmapImage ByteArrayToImage(byte[] byteArrayIn) { try { MemoryStream stream = new MemoryStream(); stream.Write(byteArrayIn, 0, byteArrayIn.Length); stream.Position = 0; System.Drawing.Image img = System.Drawing.Image.FromStream(stream); BitmapImage returnImage = new BitmapImage(); returnImage.BeginInit(); MemoryStream ms = new MemoryStream(); img.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg); ms.Seek(0, SeekOrigin.Begin); returnImage.StreamSource = ms; returnImage.EndInit(); return returnImage; } catch (Exception ex) { throw ex; } return null; } public List<Adat> Adatok() { var query = from h in context.Tabla select new Adat() { Kep = ByteArrayToImage(h.Kep) }; return query.ToList(); }

//kép betöltése, és mentése adatbázisba

public void btnTalloz_Click(object sender, RoutedEventArgs e) { OpenFileDialog op = new OpenFileDialog(); op.Title = "Select a picture"; op.Filter = "All supported graphics|*.jpg;*.jpeg;*.png|" + "JPEG (*.jpg;*.jpeg)|*.jpg;*.jpeg|" + "Portable Network Graphic (*.png)|*.png"; if (op.ShowDialog() == true) { imgPhoto.Source = new BitmapImage(new Uri(op.FileName)); } } public byte[] BitmapSourceToByteArray(BitmapSource image) { using (var stream = new MemoryStream()) { var encoder = new PngBitmapEncoder(); // or some other encoder encoder.Frames.Add(BitmapFrame.Create(image)); encoder.Save(stream); return stream.ToArray(); } } DBManager dbManager = (Application.Current as App).DBManager; Tabla au = new Tabla(); au.Kep = BitmapSourceToByteArray((BitmapSource)imgPhoto.Source); dbManager.UjAutoFelvetele(au); dbManager.AMent();

kép megjlnítés xaml kód:

<DataGridTemplateColumn Width="*" Header="Kép">
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <Image Source="{Binding SourceUri}"></Image>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
Mutasd a teljes hozzászólást!
Megvan a megoldás, ahhoz, hogy egy Image elemben meg lehessen jeleníteni kell egy konverter is:

private BitmapImage ByteArrayToImage(byte[] byteArrayIn) { try { MemoryStream stream = new MemoryStream(); stream.Write(byteArrayIn, 0, byteArrayIn.Length); stream.Position = 0; System.Drawing.Image img = System.Drawing.Image.FromStream(stream); BitmapImage returnImage = new BitmapImage(); returnImage.BeginInit(); MemoryStream ms = new MemoryStream(); img.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp); ms.Seek(0, SeekOrigin.Begin); returnImage.StreamSource = ms; returnImage.EndInit(); return returnImage; } catch (Exception ex) { throw ex; } return null; }

Majd ezután a megjelenítés:

imgPhoto.Source=
ByteArrayToImage
(auto.Kep),
Mutasd a teljes hozzászólást!

  • Hello

    public List<Adat> Adatok() { var query = from h in context.Tabla select new Adat() { Kep = ByteArrayToImage(h.Kep) }; return query.ToList(); }
    van gondolom a hiba. a
    context
    az micsoda? Ha az adabázisból szeretnél olvasni, akkor nem a 
    (Application.Current
    as App).DBManager
    remélem.

    A helyedben 1 classba raknám az adatbázis kezelést.
    Mutasd a teljes hozzászólást!
  • A context az így néz ki

    private autokolcsonzoEntities context = new autokolcsonzoEntities();
    Mi féle adatbázis kezelést? Mért kéne ciklusba rakni?
    Mutasd a teljes hozzászólást!
  • Jah. Bocsi, félreolvastam, de az adatbáziskezelés rész az külön classba van. Nem hiszem h azzal van a gond
    Mutasd a teljes hozzászólást!
  • Hello,

    Nem látom a kódodban azt a részt ami az adatbázisból lekérdezné az adatokat.
    Így hiába töltöd fel az adatbázisba, nem lesz ami visszatöltse. Javasolnám, hogy a kapott képi fájlokhoz feltöltéskor egy random file neve használj és úgy töltsd fel az adatbázisba, esetleg használj index képeket is, mert úgy kicsit gyorsabb lesz.
    Mutasd a teljes hozzászólást!
  • Helló!
    Itt van a Datarid-es megjelenítés, ez így már működik, annyi volt hiba, hogy
    ja és a ByteArrayToImagemetódusnem is kell
    Source="{Binding Kep}
    helyett más volt megadva.

    <DataGrid x:Name="dgAutok" IsReadOnly="True" AutoGenerateColumns="False" Grid.Column="1" FontSize="13" Visibility="Hidden" IsVisibleChanged="DolgozokListaja" > <DataGridTemplateColumn Width="*" Header="Kép"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <Image Source="{Binding Kep}"></Image> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> </DataGrid>



    de van még egy image elemem is amibe szintén szeretném megnyitni a képet de az még nem működik, még nem találtam meg a hibát:

    <Image Margin="0 0 0 0" Stretch="Fill" Width="250" Name="imgPhoto" />
    Itt van a metódus amivel megjelenítem az adatokat, meg is jelenik szépen minden, csak a kép nem:

    private void cbRAuto_OnSelectionChanged(object sender, SelectionChangedEventArgs e) { Auto auto = cbAutok.SelectedValue as Auto; tbEvjarata.Text = auto.Evjarat.ToString(); tbFutottKm.Text = auto.Futott_km.ToString(); tbRendszam.Text = auto.Rendszam; tbTipus.Text = auto.Tipus; imgPhoto.Source = auto.Kep; }
    Mutasd a teljes hozzászólást!
  • Megvan a megoldás, ahhoz, hogy egy Image elemben meg lehessen jeleníteni kell egy konverter is:

    private BitmapImage ByteArrayToImage(byte[] byteArrayIn) { try { MemoryStream stream = new MemoryStream(); stream.Write(byteArrayIn, 0, byteArrayIn.Length); stream.Position = 0; System.Drawing.Image img = System.Drawing.Image.FromStream(stream); BitmapImage returnImage = new BitmapImage(); returnImage.BeginInit(); MemoryStream ms = new MemoryStream(); img.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp); ms.Seek(0, SeekOrigin.Begin); returnImage.StreamSource = ms; returnImage.EndInit(); return returnImage; } catch (Exception ex) { throw ex; } return null; }

    Majd ezután a megjelenítés:

    imgPhoto.Source=
    ByteArrayToImage
    (auto.Kep),
    Mutasd a teljes hozzászólást!
  • Ha már WPF, ajánlom a figyelmedbe, hogy tudsz erre converter-t készíteni.

    Tehát normál esetben nem szükséges a code behind-odban bármilyen konvertálást elvégezni, megírod a fenti converter-t, és a XAML-ban használod az adatkötött modelleden, így:

    <Image Source="{Binding Path=Kep, Converter={StaticResource ImageConverter}}" />

    A code behind-ban gyakorlatilag egyáltalán nem kell kód (ez a WPF egyik előnye).
    Mutasd a teljes hozzászólást!
  • Megpróbálom majd így is, de most jelen esetben jó lesz így is, működik és most az a lényeg. Köszönöm a segítséget!
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd