C# Mssql <Binary data> jpg/png çevirme

utkukhraman

Öğrenci
Katılım
19 Mart 2016
Mesajlar
3
Reaksiyon puanı
0
Puanları
1
Yaş
23
Veri tabanına görselleri byte/image olarak kaydediyorum. Bunları nasıl jpg ya da png ye çevirebilirim?
 

ertan2002

Asistan
Katılım
9 Aralık 2008
Mesajlar
346
Reaksiyon puanı
112
Puanları
43
yazdigin kodu paylasir misin?
basitce istedigin sey veritabanindan aldigin byte arrayi resime cevirmek istiyorsan

Image.FromStream(new MemoryStream(resmin byte arrayi));
 

utkukhraman

Öğrenci
Katılım
19 Mart 2016
Mesajlar
3
Reaksiyon puanı
0
Puanları
1
Yaş
23
yazdigin kodu paylasir misin?
basitce istedigin sey veritabanindan aldigin byte arrayi resime cevirmek istiyorsan

Image.FromStream(new MemoryStream(resmin byte arrayi));


Kayıt için kullandığım kodun tamamı

using Microsoft.Win32;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;


namespace users.uc
{
/// <summary>
/// Interaction logic for kayit.xaml
/// </summary>
public partial class kayit : UserControl
{
public kayit()
{
InitializeComponent();
degiskenler.kuc = this;
}
private string resimyolu;
byte[] resimbyte;
private void gözatbtn_Click(object sender, RoutedEventArgs e)
{
gozat();
}

private void kaydetbtn_Click(object sender, RoutedEventArgs e)
{
dolumu();
}


private void Grid_Loaded(object sender, RoutedEventArgs e)
{
kayitnogetir();
}

int kayitid = 0;
private void kayitnogetir()
{
kayitid = 0;

var sorgu = from a in degiskenler.db.user select a.id;
foreach (var item in sorgu)
{

kayitid = item;
}
kayitid++;
idtxt.Text = kayitid.ToString();
}

private void dolumu(){
if (kadi.Text != "" && pass.Text != "" && posta.Text !="")
{
kayitet();
}
else
{
MessageBox.Show("Alanları Doldur");
}
}

private void kayitet()
{
var sorgu = from a in degiskenler.db.user where a.kadi == kadi.Text select new { a.kadi };
if (sorgu != null)
{
user o = new user();
o.kadi = kadi.Text.ToLower();
o.pass = pass.Text;
o.mail = posta.Text.ToLower();
o.img = resimbyte;
degiskenler.db.user.Add(o);
degiskenler.db.SaveChanges();
MessageBox.Show("kayıt tamam");
kayitnogetir();
// temizle();
}
else
{
MessageBox.Show("kullanici adi mevcut");
}
}
private void gozat()
{
try
{
OpenFileDialog ofd = new OpenFileDialog();
if (ofd.ShowDialog() == true)
{
resimyolu = ofd.FileName.ToString();
resimbyte = File.ReadAllBytes(resimyolu);
Stream obje = new MemoryStream(resimbyte);
BitmapImage image = new BitmapImage();
image.BeginInit();
image.StreamSource = obje;
image.EndInit();
resim.Source = image;
}
}
catch (Exception x)
{

MessageBox.Show(x.Message);
}
}
}
}
 

ertan2002

Asistan
Katılım
9 Aralık 2008
Mesajlar
346
Reaksiyon puanı
112
Puanları
43
benzer sorunu ben de yasamistim hocam ve büyük ihtimal ayni sorun :)
sorun memorystream den kaynakli.. Bir sekilde stream 0. pozisyonda degil. Stream'i, image source olarak vermeden önce index pozisyonunu sifira ayarlmana lazim


Burda örnek bir fonksiyon var, istersen kendi örnegin uyglarsin istersen direk bu metodu kullanirsin

C#:
    private static BitmapImage LoadImage(byte[] imageData)
    {
        if (imageData == null || imageData.Length == 0) return null;
        var image = new BitmapImage();
        using (var mem = new MemoryStream(imageData))
        {
            mem.Position = 0;
            image.BeginInit();
            image.CreateOptions = BitmapCreateOptions.PreservePixelFormat;
            image.CacheOption = BitmapCacheOption.OnLoad;
            image.UriSource = null;
            image.StreamSource = mem;
            image.EndInit();
        }
        image.Freeze();
        return image;
    }


kendi kodunu kullanmak istiyorsan ise

C#:
Stream obje = new MemoryStream(resimbyte);
obje.Position = 0;

yaparsan calismasi lazim..

Ancak tavsiyem ilk verdigim kod parcasindaki gibi using kelimesini kullanman. Cünkü Stream classi IDisposable interface'inden türemis (Stream Class (System.IO))

yani demek oluyor ki, nesne ile isin bitince direk olarak dispose metodunu cagirarak nesneyi bellekten kaldirabilirsin. Ancak daha kolay yol olarak

C#:
using (var obje = new DispoableClass im (Senin örnekte MemoryStream oluyor))

{

----

}

using kullanmak istemiyorsan;

C#:
...
image.EndInit();
resim.Source = image;
obje.Dispose();

seklinde bir kullanimdan sonra obje object i bellekten silinir böylece olasi problemlerden karsilasmazsin. Bazen bazi yazilimci arkadaslarda bu tür bellek hatalari meydana geliyor.. Cözümü ise bu sekilde objeyi dispose etmekten geciyor.

kolay gelsin
 
Son düzenleme:

utkukhraman

Öğrenci
Katılım
19 Mart 2016
Mesajlar
3
Reaksiyon puanı
0
Puanları
1
Yaş
23
benzer sorunu ben de yasamistim hocam ve büyük ihtimal ayni sorun :)
sorun memorystream den kaynakli.. Bir sekilde stream 0. pozisyonda degil. Stream'i, image source olarak vermeden önce index pozisyonunu sifira ayarlmana lazim


Burda örnek bir fonksiyon var, istersen kendi örnegin uyglarsin istersen direk bu metodu kullanirsin

C#:
    private static BitmapImage LoadImage(byte[] imageData)
    {
        if (imageData == null || imageData.Length == 0) return null;
        var image = new BitmapImage();
        using (var mem = new MemoryStream(imageData))
        {
            mem.Position = 0;
            image.BeginInit();
            image.CreateOptions = BitmapCreateOptions.PreservePixelFormat;
            image.CacheOption = BitmapCacheOption.OnLoad;
            image.UriSource = null;
            image.StreamSource = mem;
            image.EndInit();
        }
        image.Freeze();
        return image;
    }


kendi kodunu kullanmak istiyorsan ise

C#:
Stream obje = new MemoryStream(resimbyte);
obje.Position = 0;

yaparsan calismasi lazim..

Ancak tavsiyem ilk verdigim kod parcasindaki gibi using kelimesini kullanman. Cünkü Stream classi IDisposable interface'inden türemis (Stream Class (System.IO))

yani demek oluyor ki, nesne ile isin bitince direk olarak dispose metodunu cagirarak nesneyi bellekten kaldirabilirsin. Ancak daha kolay yol olarak

C#:
using (var obje = new DispoableClass im (Senin örnekte MemoryStream oluyor))

{

----

}

using kullanmak istemiyorsan;

C#:
...
image.EndInit();
resim.Source = image;
obje.Dispose();

seklinde bir kullanimdan sonra obje object i bellekten silinir böylece olasi problemlerden karsilasmazsin. Bazen bazi yazilimci arkadaslarda bu tür bellek hatalari meydana geliyor.. Cözümü ise bu sekilde objeyi dispose etmekten geciyor.

kolay gelsin


Teşekkürler hocam sorun çözüldü.
 
Üst