Resim performansı

Görseller genellikle web'deki en ağır ve en yaygın kaynaktır. Sonuç olarak, görselleri optimize etmek web sitenizin performansını önemli ölçüde artırabilir. Çoğu durumda, resimleri optimize etmek daha az bayt göndererek ağ süresini azaltmak anlamına gelir. Ancak kullanıcının cihazına uygun boyutlarda resimler sunarak kullanıcıya gönderilen bayt miktarını da optimize edebilirsiniz.

Resimler, <img> veya <picture> öğeleri ya da CSS background-image özelliği kullanılarak bir sayfaya eklenebilir.

Resim boyutu

Resim kaynaklarını kullanma konusunda yapabileceğiniz ilk optimizasyon, resmi doğru boyutta göstermektir. Bu durumda boyut terimi, resmin boyutlarını ifade eder. Başka değişkenler dikkate alınmadığında, 500 piksel x 500 piksel boyutunda bir kapsayıcıda görüntülenen bir resim için en uygun boyut 500 piksel x 500 piksel olur. Örneğin, 1.000 piksel kare bir resim kullanmak, resmin gerekenden iki kat daha büyük olduğu anlamına gelir.

Ancak uygun resim boyutunu seçerken birçok değişken dikkate alınması gerektiğinden, her durumda uygun resim boyutunu seçmek oldukça karmaşık bir iş olabilir. 2010'da iPhone 4 piyasaya sürüldüğünde ekran çözünürlüğü (640x960), iPhone 3'ün (320x480) iki katıydı. Ancak iPhone 4'ün ekranının fiziksel boyutu iPhone 3 ile yaklaşık olarak aynı kalmıştır.

Her şeyi daha yüksek çözünürlükte göstermek, metinleri ve resimleri önemli ölçüde küçültürdü. Tam olarak söylemek gerekirse, önceki boyutlarının yarısı kadar olurdu. Bunun yerine, 1 piksel 2 cihaz pikseli oldu. Buna cihaz piksel oranı (DPR) denir. iPhone 4 ve sonrasında piyasaya sürülen birçok iPhone modelinin DPR'si 2'dir.

Önceki örneği tekrar ele alalım. Cihazın DPR değeri 2 ise ve resim 500 piksel x 500 piksel boyutunda bir kapsayıcıda gösteriliyorsa 1.000 piksel kare bir resim (öz boyut olarak adlandırılır) artık en uygun boyuttur. Benzer şekilde, cihazın DPR değeri 3 ise 1.500 piksel kare bir resim optimum boyut olur.

srcset

<img> öğesi, tarayıcı tarafından kullanılabilecek olası resim kaynaklarının listesini belirtmenize olanak tanıyan srcset özelliğini destekler. Belirtilen her resim kaynağı, resim URL'sini ve bir genişlik veya piksel yoğunluğu tanımlayıcısı içermelidir.

<img
  alt="An image"
  width="500"
  height="500"
  src="/image-500.jpg"
  srcset="/image-500.jpg 1x, /image-1000.jpg 2x, /image-1500.jpg 3x"
>

Önceki HTML snippet'inde, tarayıcıya DPR değeri 1 olan cihazlarda image-500.png, DPR değeri 2 olan cihazlarda image-1000.jpg ve DPR değeri 3 olan cihazlarda image-1500.jpg kullanması için piksel yoğunluğu tanımlayıcısı kullanılır.

Bu bilgiler basit görünse de belirli bir sayfa için en uygun resmi seçerken ekranın DPR'si tek dikkate alınacak faktör değildir. Sayfanın düzeni de dikkate alınması gereken bir faktördür.

sizes

Önceki çözüm yalnızca resmi tüm ekranlarda aynı CSS piksel boyutunda gösterirseniz işe yarar. Çoğu durumda, bir sayfanın düzeni ve kapsayıcının boyutu, kullanıcının cihazına bağlı olarak değişir.

sizes özelliği, her bir kaynak boyutunun bir medya koşulundan ve bir değerden oluştuğu bir kaynak boyutu grubu belirtmenize olanak tanır. sizes özelliği, resmin amaçlanan görüntüleme boyutunu CSS piksel cinsinden tanımlar. srcset genişlik tanımlayıcılarıyla birlikte kullanıldığında tarayıcı, kullanıcının cihazı için en uygun resim kaynağını seçebilir.

<img
  alt="An image"
  width="500"
  height="500"
  src="/image-500.jpg"
  srcset="/image-500.jpg 500w, /image-1000.jpg 1000w, /image-1500.jpg 1500w"
  sizes="(min-width: 768px) 500px, 100vw"
>

Önceki HTML snippet'inde srcset özelliği, tarayıcının aralarından seçim yapabileceği resim adaylarının virgülle ayrılmış bir listesini belirtir. Listedeki her aday, resmin URL'sinden ve ardından resmin doğal genişliğini belirten bir söz diziminde oluşur. Bir resmin öz boyutu, boyutlarıdır. Örneğin, 1000w tanımlayıcısı, resmin doğal genişliğinin 1.000 piksel olduğunu gösterir.

Tarayıcı, bu bilgileri kullanarak sizes özelliğindeki medya koşulunu değerlendirir ve bu durumda, cihazın görüntü alanı genişliği 768 pikseli aşarsa resmin 500 piksel genişliğinde gösterilmesi talimatı verilir. Daha küçük cihazlarda resim 100vw boyutunda veya tam ekran genişliğinde gösterilir.

Tarayıcı, en uygun resmi bulmak için bu bilgileri srcset resim kaynaklarının listesine ekleyebilir. Örneğin, kullanıcı 3 DPR değerine sahip 320 piksel ekran genişliğinde bir mobil cihaz kullanıyorsa resim 320 CSS pixels x 3 DPR = 960 device pixels boyutunda gösterilir. Bu örnekte, en yakın boyutlu resim 1.000 piksel (1000w) doğal genişliğe sahip image-1000.jpg olur.

Dosya biçimleri

Tarayıcılar çeşitli farklı resim dosyası biçimlerini destekler. WebP ve AVIF gibi modern resim biçimleri, PNG veya JPEG'e kıyasla daha iyi sıkıştırma sağlayabilir. Böylece resim dosyanızı daha küçük hale getirerek indirme süresini kısaltabilirsiniz. Resimleri modern biçimlerde sunarak kaynağın yükleme süresini azaltabilirsiniz. Bu da Largest Contentful Paint (LCP) metriğinin daha düşük olmasına neden olabilir.

WebP, tüm modern tarayıcılarda çalışan yaygın olarak desteklenen bir biçimdir. WebP genellikle JPEG, PNG veya GIF'den daha iyi sıkıştırma sağlar. Hem kayıplı hem de kayıpsız sıkıştırma sunar. WebP, kayıplı sıkıştırma kullanılırken bile alfa kanalı şeffaflığını destekler. Bu özellik, JPEG codec'inde yoktur.

AVIF daha yeni bir resim biçimidir ve WebP kadar yaygın olarak desteklenmese de tarayıcılarda makul düzeyde destekleniyor. AVIF hem kayıplı hem de kayıpsız sıkıştırmayı destekler. Testler, bazı durumlarda JPEG'ye kıyasla% 50'den fazla tasarruf sağladığını göstermiştir. AVIF ayrıca geniş renk gamı (WCG) ve yüksek dinamik aralık (HDR) özelliklerini de sunar.

Sıkıştırma

Resimler söz konusu olduğunda iki tür sıkıştırma vardır:

  1. Kayıplı sıkıştırma
  2. Kayıpsız sıkıştırma

Kayıplı sıkıştırma, quantization aracılığıyla resim doğruluğunu azaltarak çalışır ve chroma alt örnekleme kullanılarak ek renk bilgileri atılabilir. Kayıplı sıkıştırma, genellikle benzer içeriklere sahip fotoğraflar veya görüntüler gibi çok fazla gürültü ve renk içeren yüksek yoğunluklu resimlerde en etkilidir. Bunun nedeni, kayıplı sıkıştırma nedeniyle oluşan bozulmaları bu kadar ayrıntılı resimlerde fark etmenin çok daha zor olmasıdır. Ancak kayıplı sıkıştırma, çizgi resimler gibi keskin kenarlar, benzer şekilde keskin ayrıntılar veya metin içeren görüntülerde daha az etkili olabilir. Kayıplı sıkıştırma, JPEG, WebP ve AVIF resimlerine uygulanabilir.

Veri kaybı olmadan sıkıştırma, bir resmi veri kaybı olmadan sıkıştırarak dosya boyutunu küçültür. Kayıpsız sıkıştırma, bir pikseli komşu pikselleriyle arasındaki farka göre tanımlar. GIF, PNG, WebP ve AVIF resim biçimleri için kayıpsız sıkıştırma kullanılır.

Squoosh, ImageOptim veya bir resim optimizasyonu hizmetini kullanarak resimlerinizi sıkıştırabilirsiniz. Sıkıştırma işleminde tüm durumlara uygun evrensel bir ayar yoktur. Önerilen yaklaşım, resim kalitesi ile dosya boyutu arasında iyi bir denge bulana kadar farklı sıkıştırma düzeyleriyle denemeler yapmaktır. Bazı gelişmiş resim optimizasyon hizmetleri bunu sizin için otomatik olarak yapabilir ancak bu hizmetler tüm kullanıcılar için ekonomik olmayabilir.

<picture> öğesi

<picture> öğesi, birden fazla resim adayı belirtme konusunda size daha fazla esneklik sunar:

<picture>
  <source type="image/avif" srcset="image.avif">
  <source type="image/webp" srcset="image.webp">
  <img
    alt="An image"
    width="500"
    height="500"
    src="/image.jpg"
  >
</picture>

<picture> öğesi içinde <source> öğeleri kullandığınızda AVIF ve WebP resimleri için destek ekleyebilirsiniz ancak tarayıcı modern biçimleri desteklemiyorsa daha uyumlu eski resim biçimlerine geri dönebilirsiniz. Bu yaklaşımda tarayıcı, eşleşen ilk <source> öğesini seçer. Resmi bu biçimde oluşturabiliyorsa bu resmi kullanır. Aksi takdirde tarayıcı, belirtilen bir sonraki <source> öğesine geçer. Önceki HTML snippet'inde AVIF biçimi, WebP biçimine göre önceliklidir. AVIF veya WebP desteklenmiyorsa JPEG biçimine geçilir.

<picture> öğesi, içine yerleştirilmiş bir <img> öğesi gerektirir. alt, width ve height özellikleri <img> üzerinde tanımlanır ve hangi <source> seçilmiş olursa olsun kullanılır.

<source> öğesi media, srcset ve sizes özelliklerini de destekler. Daha önceki <img> örneğine benzer şekilde, bunlar tarayıcıya farklı görüntüleme alanlarında hangi resmin seçileceğini belirtir.

<picture>
  <source
    media="(min-resolution: 1.5x)"
    srcset="/image-1000.jpg 1000w, /image-1500.jpg 1500w"
    sizes="(min-width: 768px) 500px, 100vw"
  >
  <img
    alt="An image"
    width="500"
    height="500"
    src="/image-500.jpg"
  >
</picture>

media özelliği bir medya koşulu alır. Önceki örnekte, medya koşulu olarak cihazın DPR'si kullanılmıştır. DPR'si 1,5'ten büyük veya 1,5'e eşit olan tüm cihazlar ilk <source> öğesini kullanır. <source> öğesi, tarayıcıya görüntü alanının 768 pikselden geniş olduğu cihazlarda seçilen resim adayını 500 piksel genişliğinde görüntülemesini söyler. Bu, küçük cihazlarda görünüm alanının tüm genişliğini kaplar. media ve srcset özelliklerini birleştirerek hangi resmin kullanılacağı üzerinde daha ayrıntılı kontrol sahibi olabilirsiniz.

Bu durum, çeşitli ekran genişliklerinin ve cihaz piksel oranlarının değerlendirildiği aşağıdaki tabloda gösterilmektedir:

Görüntü alanı genişliği (piksel) 1 DPR 1,5 DPR 2 DPR 3 DPR
320 500.jpg 500.jpg 500.jpg 1000.jpg
480 500.jpg 500.jpg 1000.jpg 1500.jpg
560 500.jpg 1000.jpg 1000.jpg 1500.jpg
1024 500.jpg 1000.jpg 1000.jpg 1500.jpg
1920 500.jpg 1000.jpg 1000.jpg 1500.jpg

1 DPR'ye sahip cihazlar, resmi 500 piksel genişliğinde harici boyutta görüntüleyen çoğu masaüstü kullanıcısı da dahil olmak üzere image-500.jpg resmini indirir. Öte yandan, DPR'si 3 olan mobil kullanıcılar, DPR'si 3 olan masaüstü cihazlarda kullanılan image-1500.jpg'yi indirir.

<picture>
  <source
    media="(min-width: 561px) and (min-resolution: 1.5x)"
    srcset="/image-1000.jpg 1000w, /image-1500.jpg 1500w"
    sizes="(min-width: 768px) 500px, 100vw"
  >
  <source
    media="(max-width: 560px) and (min-resolution: 1.5x)"
    srcset="/image-1000-sm.jpg 1000w, /image-1500-sm.jpg 1500w"
    sizes="(min-width: 768px) 500px, 100vw"
  >
  <img
    alt="An image"
    width="500"
    height="500"
    src="/image-500.jpg"
  >
</picture>

Bu örnekte, <picture> öğesi, yüksek PBM'ye sahip geniş cihazlar için farklı resimler kullanmak üzere ek bir <source> öğesi içerecek şekilde ayarlanmıştır:

Görüntü alanı genişliği (piksel) 1 DPR 1,5 DPR 2 DPR 3 DPR
320 500.jpg 500.jpg 1000-sm.jpg 1000-sm.jpg
480 500.jpg 500.jpg 1000-sm.jpg 1500-sm.jpg
560 500.jpg 1000-sm.jpg 1000-sm.jpg 1500-sm.jpg
1024 500.jpg 1000.jpg 1000.jpg 1500.jpg
1920 500.jpg 1000.jpg 1000.jpg 1500.jpg

Bu ek sorguyla, image-1000-sm.jpg ve image-1500-sm.jpg'un küçük görüntü alanlarında gösterildiğini görebilirsiniz. Bu ek bilgiler, sıkıştırma kusurları bu boyut ve yoğunlukta çok fazla görünmediğinden ve masaüstü cihazlardaki resim kalitesinden ödün verilmediğinden resimleri daha da sıkıştırmanıza olanak tanır.

Alternatif olarak, srcset ve media özelliklerini ayarlayarak küçük görüntü alanlarında büyük resimler yayınlamaktan kaçınabilirsiniz:

<picture>
  <source
    media="(min-width: 561px)"
    srcset="/image-500.jpg, /image-1000.jpg 2x, /image-1500.jpg 3x"
  >
  <source
    media="(max-width: 560px)"
    srcset="/image-500.jpg 1x, /image-1000.jpg 2x"
  >
  <img
    alt="An image"
    width="500"
    height="500"
    src="/image-500.jpg"
  >
</picture>

Önceki HTML snippet'inde, genişlik tanımlayıcıları cihaz piksel oranı tanımlayıcıları lehine kaldırılmıştır. Mobil cihazlarda sunulan resimler, DPR değeri 3 olan cihazlarda bile /image-500.jpg veya /image-1000.jpg ile sınırlıdır.

Karmaşıklığı yönetme

Duyarlı resimlerle çalışırken her resim için birçok farklı boyut varyantı ve biçimle karşılaşabilirsiniz. Önceki örnekte, her boyut için varyantlar kullanılır ancak AVIF ve WebP hariç tutulur. Kaç varyantınız olmalıdır? Birçok mühendislik sorununda olduğu gibi, yanıt genellikle "bağlıdır" şeklinde olur.

En iyi uyumu sağlamak için mümkün olduğunca fazla varyant kullanmak cazip gelebilir ancak her ek resim varyantının bir maliyeti vardır ve tarayıcı önbelleği daha az verimli şekilde kullanılır. Yalnızca bir varyant olduğunda her kullanıcı aynı resmi alır. Bu nedenle resim çok verimli bir şekilde önbelleğe alınabilir.

Öte yandan, çok sayıda varyant varsa her varyant için başka bir önbelleğe alma girişi gerekir. Varyantın önbelleğe alma girişinin süresi dolduysa ve resmin kaynak sunucudan tekrar getirilmesi gerekiyorsa sunucu maliyetleri artabilir ve performans düşebilir.

Bunun dışında, HTML dokümanınızın boyutu her varyasyonla birlikte büyür. Her resim için birden fazla kilobaytlık HTML gönderdiğinizi fark edebilirsiniz.

Accept istek başlığına göre resim yayınlama

Accept HTTP istek üst bilgisi, sunucuyu kullanıcının tarayıcısının hangi içerik türlerini anladığını bilgilendirir. Bu bilgiler, sunucunuz tarafından HTML yanıtlarınıza ek bayt eklemeden en uygun resim biçimini sunmak için kullanılabilir.

if (request.headers.accept) {
  if (request.headers.accept.includes('image/avif')) {
    return reply.from('image.avif');
  } else if (request.headers.accept.includes('image/webp')) {
    return reply.from('image.webp');
  }
}

return reply.from('image.jpg');

Önceki HTML snippet'i, en uygun resim biçimini seçip sunmak için sunucunuzun JavaScript arka ucuna ekleyebileceğiniz kodun basitleştirilmiş bir sürümüdür. Accept istek üst bilgisi image/avif içeriyorsa AVIF resmi yayınlanır. Aksi takdirde, Accept üst bilgisi image/webp içeriyorsa WebP resmi yayınlanır. Bu koşulların hiçbiri geçerli değilse JPEG resmi yayınlanır.

Yanıtları, neredeyse her tür web sunucusunda Accept istek başlığının içeriğine göre değiştirebilirsiniz. Örneğin, Apache sunucularındaki resim isteklerini mod_rewrite kullanarak Accept başlığına göre yeniden yazabilirsiniz.

Bu, Görsel İçerik Yayınlama Ağı'nda (CDN) göreceğiniz davranışa benzer. Resim CDN'leri, resimleri optimize etmek ve kullanıcının cihazına ve tarayıcısına göre en uygun biçimi göndermek için mükemmel çözümlerdir.

Buradaki en önemli nokta, bir denge bulmak, makul sayıda resim adayı oluşturmak ve kullanıcı deneyimi üzerindeki etkiyi ölçmektir. Farklı resimler farklı sonuçlar verebilir. Her resme uygulanan optimizasyonlar, sayfadaki boyutuna ve kullanıcılarınızın kullandığı cihazlara bağlıdır. Örneğin, tam genişlikli bir hero resmi, e-ticaret ürün listeleme sayfasındaki küçük resimlerden daha fazla varyant gerektirebilir.

Geç yükleme

loading özelliğini kullanarak tarayıcıya, resimleri görüntü alanında göründüklerinde yavaş yüklemesini söyleyebilirsiniz. lazy özellik değeri, tarayıcıya görüntüyü görüntü alanının içinde (veya yakınında) olana kadar indirmemesini söyler. Bu, bant genişliğinden tasarruf sağlar ve tarayıcının, görüntü alanında bulunan kritik içeriği oluşturmak için ihtiyaç duyduğu kaynaklara öncelik vermesine olanak tanır.

decoding

decoding özelliği, tarayıcıya resmin kodunu nasıl çözmesi gerektiğini bildirir. async değeri, tarayıcıya resmin kodunu çözmenin eşzamansız olabileceğini bildirir. Bu da diğer içeriğin oluşturulma süresini iyileştirebilir. sync değeri, tarayıcıya resmin diğer içerikle aynı anda sunulmasını söyler. auto için varsayılan değer, tarayıcının kullanıcı için en iyi olana karar vermesine olanak tanır.

Resim demoları

Bilginizi test etme

Hangi resim biçimleri kayıpsız sıkıştırmayı destekler?

GIF olarak kaydedildiğinden emin olun.
Doğru!
JPEG.
Tekrar deneyin.
.PNG.
Doğru!
WebP.
Doğru!
AVIF.
Doğru!

Hangi resim biçimleri kayıplı sıkıştırmayı destekler?

GIF olarak kaydedildiğinden emin olun.
Tekrar deneyin. GIF biçimi yalnızca 256 renkten oluşan sınırlı bir paleti desteklese de GIF'e dönüştürmeden önce kayıplı kodlama yapılmalıdır.
JPEG.
Doğru!
.PNG.
Tekrar deneyin.
WebP.
Doğru!
AVIF.
Doğru!

Genişlik tanımlayıcısı (örneğin, 1000w), srcset özelliğinde belirtilen bir resim adayı hakkında tarayıcıya ne söyler?

Resmin dış genişliği (yani, sayfaya stiller uygulandıktan sonra düzendeki resmin boyutları)
Tekrar deneyin.
Resmin öz genişliği (yani resmin boyutları).
Doğru!

sizes özelliği, uygulandığı <img> öğesi hakkında tarayıcıya ne söyler?

Kullanıcının mevcut görüntü alanının boyutları göz önünde bulundurularak, bir <img> öğesinin srcset alanında belirtilen hangi adayın yüklenmesi gerektiğini ifade eden mantık.
Doğru!
<img> öğesinin srcset özelliğinden yüklenecek resmin öz genişliği.
Tekrar deneyin.

Sıradaki konu: Video performansı

Görüntüler web'de kullanılan en yaygın medya türü olsa da performans söz konusu olduğunda göz önünde bulundurmanız gereken tek şey değildir. Web'de kullanılan yaygın bir medya türü olan videonun da kendine özgü performans özellikleri vardır. Bu kursun sonraki modülünde, videoları optimize etme ve verimli bir şekilde yüklemeyle ilgili bazı teknikleri keşfedin.