Merhabalar..
Geçenlerde karşılaştığım bir sorun üzerine bu yazıyı yazma gereği hissettim. Başlıkta da yazdığım üzere resimleri eğer ısrarla(!) veritabanında tutmak istiyorsak dikkat etmemiz gereken bazı şeyler var. Özellikle o uygulama bir WPF uygulaması ise.. ![]()
Öncelikle ben bir UploadControl aracılığıyla ( belki onun için yazdığım UserControl’u de koyarım bir ara buraya) resmin yolunu almak istiyorum ve bunu bir şekilde byte dizisine çevirerek veritabanında kaydetmem gerekiyor. Bu arada benim bildiğim, resimleri veritabanında 3 şekilde tutabiliyoruz. Ama bunun en verimlisi ve en az yer kaplayanı kesinlikle binary şeklinde kaydetmek. O yüzden bu konuyu tartışmıyorum.![]()
İki tane static method yazıp her yerde kullanabilmek en mantıklısı bana göre. Bunlardan biri byte[] , diğeri ise ImageBrush şeklinde dönüş değerine sahip olacak.
Elimdeki resmi binary’e çevirmek için şöyle bir method yazarım;
public static byte[] ImageToBinary(string path) { FileStream fileStream = new FileStream(path, FileMode.Open, FileAccess.Read); byte[] b = new byte[fileStream.Length]; fileStream.Read(b, 0, (int)fileStream.Length); fileStream.Close(); return b; }
Daha sonra da gerekli yerlerde veritabanından çektiğim binary data’yı projemde kullanmak üzere bir resime çevirmek için;
public static ImageBrush BinaryToImage(byte[] binaryData) { if (binaryData == null) return null; BitmapImage bi = new BitmapImage(); bi.BeginInit(); bi.CreateOptions = BitmapCreateOptions.None; bi.CacheOption = BitmapCacheOption.Default; bi.StreamSource = new MemoryStream(binaryData); bi.EndInit(); ImageBrush image = new ImageBrush(); image.ImageSource = bi; image.Stretch = Stretch.Uniform; return image; }
Yukarıdaki methodda ImageBrush kullanmamın sebebi WPF projelerinde rahatça kullanılıbiliyor olması aslında. Çünkü herhangi bir kontrolün background özelliğine ‘image’ dönüş değerini verebiliyoruz. Eğer WPF veya Silverlight üzerinde çalışıyorsak System.Drawing.Image ‘den uzak durulmalı. ![]()
Görüşmek üzere.