Prenons une image...

<img src="img/johnny.jpg">

Si on lui donne une largeur ET une hauteur, alors elle se déforme :

width:140px;
height:140px;

Idem si on fixe son ratio avec aspect-ratio :

width:140px;
aspect-ratio: 1 / 1;

aspect-ratio c'est donc le rapport entre la largeur et la hauteur de l'image.
C'est très pratique quand vous avez une largeur en % par ex,
dans ce cas c'est compliqué d'indiquer une hauteur élastique (en % ça ne marche pas)...
Avec aspect-ratio pas de problème d'unité !

On écrit toujours 2 nombres séparés par le symbole /, avec des espaces entre les chiffres et / , du genre :

aspect-ratio: 16 / 9;
aspect-ratio: 3 / 2;

Plusieurs façons d'éviter que l'image soit déformée :

object-fit: cover;

Rognée si besoin, jamais de marge visible.

object-fit: contain;

Ajustée sans rogner, avec une marge si besoin.

object-fit: none;

Image rognée, affichée à sa taille d'origine.

Ca marche aussi avec des images élastiques, en %, en vh ou en vw...

Et avec une image de fond...

background-image:
url('../img/johnny.jpg');

Par défaut : image affichée à sa taille d'origine et rognée si besoin (répétée sinon).

background-size: cover;

Rognée si besoin, jamais de marge visible.

background-size: contain;

Ajustée sans rogner, avec une marge, et répétée (par défaut).

background-size: contain;
background-repeat: no-repeat;

Pour empêcher la répétition...

background-size: contain;
background-repeat: no-repeat;
background-position: center center;

Pour gérer la position de l'image de fond.

Il y a d'autres options liées à background, qui sont bien documentée sur le net.