Resim boyutunu öğrenme

Resim boyutunu öğrenme

Bu yazıda en hızlı şekilde bir resmin genişlik ve yükseklik bilgisini öğrenebiliriz, bunu inceleyeceğiz.

C# ile bir resmin boyutunu nasıl öğrenebiliriz?

İnternetten bunu arattığınızda çoğu arama sonucunda Image.FromFile() metodunun kullanıldığını görürsünüz. Ancak bu metod çok da efektif sonuçlar vermez. Çünkü resim dosyasının tamamını okur. Yani resminiz 1Gb ise bu işlem -birazcık- uzun sürecektir.

Bunun yerine Stream (akış) olarak resim dosyasını açıp çok daha hızlı bir şekilde boyutlarını öğrenebiliriz.

Gelin birlikte bu iki farklı yaklaşımı ufak bir testle karşılaştıralım.

Bunun için harddiskimin bir köşesinde bulduğum ve cep telefonumla çektiğim 277 adet toplam boyutu 1.1Gb olan resim dosyalarını kullanacağım. (Her bir resim ortalama ~4Mb)

1. yöntem:

var yol = @"E:\Photos";
var dosyalar = Directory.GetFiles(yol, "*.jpg");
Stopwatch sw = new Stopwatch();
sw.Start();
int i = 1;
foreach (var dosya in dosyalar)
{
  int w, h;
  float hr, vr;
  using (var img = Image.FromFile(dosya))
  {
    h = img.Height;
    w = img.Width;
    hr = img.HorizontalResolution;
    vr = img.VerticalResolution;
  }
  Console.WriteLine($"{i++}. dosya için; W: {w}, H: {h}, VR: {vr}, HR: {hr}");
}
sw.Stop();
Console.WriteLine("Geçen süre: " + sw.Elapsed.ToString());

Sonuç:

1. dosya için; W: 4032, H: 3024, VR: 72, HR: 72
....
277. dosya için; W: 4032, H: 3024, VR: 72, HR: 72
Geçen süre: 00:00:23.9782321

2. yöntem:

var yol = @"E:\Photos";
var dosyalar = Directory.GetFiles(yol, "*.jpg");
Stopwatch sw = new Stopwatch();
sw.Start();
int i = 1;
foreach (var dosya in dosyalar)
{
  int w, h;
  float hr, vr;
  using (var fileStream = new FileStream(dosya, FileMode.Open, FileAccess.Read, FileShare.Read))
  {
     using (var img = Image.FromStream(fileStream, false, false))
     {
       h = img.Height;
       w = img.Width;
       hr = img.HorizontalResolution;
       vr = img.VerticalResolution;
     }
  }
  Console.WriteLine($"{i++}. dosya için; W: {w}, H: {h}, VR: {vr}, HR: {hr}");
}
sw.Stop();
Console.WriteLine("Geçen süre: " + sw.Elapsed.ToString());

Sonuç:

1. dosya için; W: 4032, H: 3024, VR: 72, HR: 72
....
277. dosya için; W: 4032, H: 3024, VR: 72, HR: 72
Geçen süre: 00:00:00.1359393

 


Bu sonuçlara göre 1. yöntem, 2. yönteme göre ~176 kez daha yavaş.

Bu testi gerçekleştirdiğim bilgisayarın hafızası 16Gb ve işlemcisi i7-7700. (Harrdisk SSD değil)

Sizin bilgisayarınızda daha farklı sonuçlar ortaya çıkabilir, ancak yine de kesin olarak diyebiliriz ki: "2. yöntem kesinlikle 1. yönteme göre çok daha hızlı"

Herkese iyi kodlamalar...