Önceki yazılarımdan C# İle Bot Yapımı – Web Sitelerinden İçerik Çekme başlıklı yazımda C# ile içerik çekme botu nasıl yazılır bahsetmiştim.Haliyle bu konu üzerinde çalışmalarımı sürdürürken internetten bir resim indirmenin peşine düştüm.Aslında mantıksal olarak çok basit olsada, programatik olarak hangi nesneler bu işi daha hızlı ve aktif bir şekilde yapabilir merak ettim doğrusu.Detaylı araştırmalarım neticesinde sizlere sunacağım bir kod parçacığı sayesinde internetten istediğiniz resmi anında ve temiz bir şekilde indirmenin yolunu buldum.Ama bu bulduğum algoritmanın güzel bir yanı ise edindiğiniz resmi istediğiniz formatta elde edebiliyorsunuz.
Bu yazımda örnek bir proje uygulaması üzerinden kodu paylaşacağım.Beni bilirsiniz, genellikle bodoslama kod paylaşmaktansa, hangi kodun ne işe yaradığını anlata anlata yazmayı severim 🙂
Son kez şunuda belirtmek isterim; Sınıf, metod, özellik vs. gibi elemanların isimlerini İngilizce yazmaktan hiç hoşlanmam.Lakin bu yazımda biraz İngilizce isimler üzerinde program yazacağız.Bu seferlik mazur görün 🙂
Evet, öncelikle bütün işlemleri yapacak metodlarımızı içinde barındıracak olan “DownloadImage” isminde bir sınıf oluşturalım.(İsimleri istediğiniz gibi değiştirebilirsiniz.Tabi program akışındaki yerlerini de değiştirmeniz şartıyla.)
public class DownloadImage { }
Şimdi bu sınıfımıza iki tane Field oluşturalım.
private string imageUrl; private Bitmap bitmap;
Yukarıdaki yazdığımız Field’lardan string tipteki “imageUrl” isimli olanı internetten indireceğimiz resmin linkini tutacaktır.Bitmap tipteki “bitmap” isimli olan Field’ımız ise resmimizi Bitmap tipinde taşıyacaktır.
Şimdi programlama dilinin esnekliklerinden biri olan Yapıcı Metod yani Constructor metodu oluşturup, “DownloadImage” sınıfımızdan nesne oluşturulma anında belirli değerler alalım.
public DownloadImage(string imageUrl) { this.imageUrl = imageUrl; }
Burada Contructor ile aldığımız değer yukarıda tanımladığımız “imageUrl” değişkenine aktarılacak değerdir.Yani resim linkini “DownloadImage” nesnesini tanımlar tanımlamaz “imageUrl” değişkenimize verebiliriz.
Şimdi ise resmimizi daha önce tanımladığımız Bitmap tipinden olan “bitmap” değişkenimize(Field) aktaralım.Bu işlem için aşağıdaki gibi bir metod yazacağız.
public void Download() { try { WebClient client = new WebClient(); Stream stream = client.OpenRead(imageUrl); bitmap = new Bitmap(stream); stream.Flush(); stream.Close(); } catch (Exception e) { Console.WriteLine(e.Message); } }
Bu metod sayesinde “imageUrl” isimli değişkenimize verilen resim linkini kanallar aracılığıyla okutup, Bitmap nesnesine aktarabiliyoruz.Farkındaysanız, “bitmap” isimli referansımıza burada nesne bağlanıyor.
Artık Bitmap nesnemizdeki resmimizi bilgisayarımıza indirebilmek için son kozumuzu oynayalım.
public void SaveImage(string filename, ImageFormat format) { if (bitmap != null) { bitmap.Save(filename, format); } }
Bu metodu incelerseniz eğer, string tipten “filename” ve ImageFormat tipinden “format” isimli iki parametre mevcut.”filename” parametremize resmimizi nereye indirmek istiyorsak dizinin adresini veriyoruz.”format” parametresi ile de resmimizi indirirken hangi formatta indireceğimizi ayarlayabiliyoruz.Yani “.jpeg” formatında bir resmi “.png” formatında kaydedebiliriz.
Şimdilik işimizi görecek sınıfı ve metodları tam olarak yazdık.Ha eğer derseniz ki, “kardeşim ben bu Bitmap nesnesinde oynamalar yapmak isterim” diye.O zaman bu sınıfa aşağıdaki gibi bir metod daha ekleyebiliriz.
public Bitmap GetImage() { return bitmap; }
Bu metod ilede Bitmap Field’ımıza ulaşabilir ve üzerinde istediğiniz fantaziyi gerçekleştirebilirsiniz.
Şimdi “DownloadImage” sınıfımızın bütün içeriğini derlenmiş bir şekilde komple aşağıya yazıyorum.
public class DownloadImage { private string imageUrl; private Bitmap bitmap; public DownloadImage(string imageUrl) { this.imageUrl = imageUrl; } public void Download() { try { WebClient client = new WebClient(); Stream stream = client.OpenRead(imageUrl); bitmap = new Bitmap(stream); stream.Flush(); stream.Close(); } catch (Exception e) { Console.WriteLine(e.Message); } } public Bitmap GetImage() { return bitmap; } public void SaveImage(string filename, ImageFormat format) { if (bitmap != null) { bitmap.Save(filename, format); } } }
Aslında yazıyı okumanıza gerek kalmadan bu kod parçacığını alıp kullanabilirsiniz.Lakin ben hangi metodun ne işe yaradığından bahsetmek için konuyu irdelemek istedim.
Bizim için asıl önemli olan bu sınıfı kullanabilmek.Mantıksal olarak hangi metodları önceden çağırmamız gerektiğini size göstermek istiyorum.
private void Form1_Load(object sender, EventArgs e) { DownloadImage ImageDownload = new DownloadImage("http://app.nedir.com/content_imgs/resim.jpg"); ImageDownload.Download(); ImageDownload.SaveImage("D:\\Resimadi.png", ImageFormat.Png); }
Yukarıdaki kod bloğunu incelerseniz eğer, “DownloadImage” tipinden nesnemizi oluşturuyor ve Contructor metoda resim adresini veriyoruz.Daha sonra Download metodumuzu çağırıp, Bitmap nesnemizi oluşturuyoruz.En sonunda SaveImage isimli metodumuz sayesinde resmimizi istediğimiz dizine kaydediyoruz.
Bu sınıfın elemanlarını mantıksal olarak bu şekilde kullanmanız gerekmektedir.Aksi taktirde resim indirme işlemi gerçekleşmeyecektir.
Bir yazımızın daha sonuna gelmiş bulunmaktayız.Buraya kadar sıkılmadan, sabrederek okuduğunuz için minnettarım sizlere..
Sonraki yazılarımda görüşmek üzere..
İyi çalışmalar..