|
30 Ekim 2007 |
|
Resim Dosyalarını Byte Dizisine Aktarmak |
|
Bilindiği gibi SQL Server veritabanlarında resim veya ses bilgilerini saklama gereği duyulduğunda Image veya Binary alanlar kullanılmaktadır. Bunun için resim veya ses dosyası içeriğininin önceden byte dizisine alınması gerekiyor. Birkaç gün önce bir forumda bu işlemin nasıl yapıldığı, başka bir deyişle resim dosyası içeriğinin byte dizisine nasıl aktarıldığı soruluyordu. Bu soryua ADO.NET kitabımda kullandığım kısa bir kod ile cevap verdim. Bu yazıda diskte bulunan bir resim dosyasını okuyup byte dizisine aktaracağım. Sonra bu byte dizisini başka bir dosyaya yazacağım. Böylece konuyu kavramş olacağız. Bu amaçla hazırladığım C# projesinin formunu aşağıdaki gibi düzenledim.
Kullanıcı Byte dizisine aktarmak istediği resim dosyasını seçmek üzere "Dosya Oku" başlıklı düğmeyi tıklayıp ekrana dosya seçilen diyalog kutusunu getirecek. Seçtiği dosya hem Byte dizisine aktarılacak hem de PictureBox’ta gösterilecek. Bu nedenle forma bir OpenFileDialog nesnesi yerleştirip “Dosya Oku” düğmesi tıklandığı zaman işletilmek üzere aşağıda verdiğim kodu yazdım.
private void Oku_Click(object sender, EventArgs e) { System.Windows.Forms.DialogResult Sonuc; string Dosya; openFileDialog1.Filter = "Resim Dosyaları |*.JPG;*.BMP;*.GIF"; Sonuc = openFileDialog1.ShowDialog(); if (Convert.ToString(Sonuc) == "OK") { Dosya = openFileDialog1.FileName; pictureBox1.Image = System.Drawing.Bitmap.FromFile(Dosya); } }
Bu kodda kullanıcının seçtiği resim dosyasının içeriği PictureBox’ta görüntülenmektedir. Şimdi bu koda ekleme yapıp seçilen resim dosyasının içeriğini Byte dizisine aktaracağım. Aşağıda verdiğim kodda FileStream sınıfının örneğini alarken içeriği PictureBox’a aktarılan dosyayı parametre oalrak verdim.
byte[] Dizi; private void Oku_Click(object sender, EventArgs e) { System.Windows.Forms.DialogResult Sonuc; string Dosya = ""; openFileDialog1.Filter = "Resim Dosyaları |*.JPG;*.BMP;*.GIF"; Sonuc = openFileDialog1.ShowDialog(); if (Convert.ToString(Sonuc) == "OK") { Dosya = openFileDialog1.FileName; pictureBox1.Image = System.Drawing.Bitmap.FromFile(Dosya); } FileStream Akis; Akis = new FileStream(Dosya, FileMode.Open, FileAccess.Read); long Uzunluk = Akis.Length; Dizi = new byte[Uzunluk]; Akis.Read(Dizi, 0, (int)Uzunluk); } }
Devamında FileStream nesnesinin içeriğini Read() metodu ile okuyup byte tipindeki dizi değişkene aktardım. Bu işlemin başarılı olup olmadığını test etmek için Byte dizisinin içeriğini başka bir resim dosyasına yazacağım. Bu amaçla “Dosyaya Yaz” başlıklı düğme için aşağıda verdiğim kodu yazdım.
private void Yaz_Click(object sender, EventArgs e) { System.Windows.Forms.DialogResult Sonuc; string Dosya = ""; saveFileDialog1.Filter = "Resim Dosyaları |*.JPG;*.BMP;*.GIF"; Sonuc = saveFileDialog1.ShowDialog(); if (Convert.ToString(Sonuc) == "OK") Dosya = saveFileDialog1.FileName; else return; FileStream akis_yaz = new FileStream(Dosya, FileMode.Create); akis_yaz.Write(Dizi,0, Dizi.Length); } |