Le code que vous utilisez ne préserve pas le rapport d'aspect. De Image::Imlib2::create_scaled_image
Si x ou y sont 0, alors conservez le rapport d'aspect donné dans l'autre.
changement si la ligne
my $cropped_image = $image->create_scaled_image(50, 50);
à
my $scaled_image = $image->create_scaled_image(50, 0);
et la nouvelle image sera de 50 pixels de large, et sa hauteur calculée de façon à maintenir le rapport d'aspect d'origine.
Comme ce n'est pas un rognage, j'ai aussi changé le nom de la variable. Comme pour les autres questions, voici une discussion de base à partir des commentaires. S'il vous plaît chercher des tutoriels sur le traitement d'image. En outre, la documentation des grandes bibliothèques a souvent des explications courtes et bonnes.
Ceci est regroupe des commentaires jugés utiles. Voir aussi La réponse courte et claire de Borodin. Imaginez que vous vouliez dessiner une image (d'une photo sympa) vous-même de la façon suivante. Vous dessinez une grille de, disons, 120 (horizontalement) par 60 (verticalement) des boîtes. Donc 120 x 60, 720 boîtes.Ce sont vos "pixels", et vous ne pouvez remplir chacun qu'une seule couleur. Si la photo que vous redessinez est «principalement» bleue à un endroit donné, vous coloriez ce pixel en bleu. Etc. Il n'est pas facile de se retrouver avec un redessin fidèle - plus les pixels sont denses, plus les pixels sont grands.
Imaginez maintenant que vous voulez en dessiner une autre copie, juste plus petite. Si vous faites 20x20 ce sera complètement différent, puisque c'est un carré. La meilleure chance de l'obtenir pour "regarder la même chose" est de choisir le rapport 2-à-1 (comme 120x60), disons 40x20. C'est "aspect-ratio". Mais il y a toujours un problème, puisque maintenant vous devez décider à nouveau quelle couleur choisir pour chaque boîte, afin de représenter ce qui est "principalement" sur la photo à cet endroit. Il existe des algorithmes pour cela ("échantillonnage", voir votre deuxième lien). C'est impliqué avec le "redimensionnement". La "qualité" du dessin obtenu doit clairement être bien pire.
Donc, "redimensionner" n'est pas si simple. Mais, pour nous utilisateurs, nous avons surtout besoin de savoir à peu près ce qui est impliqué, et de découvrir comment utiliser ces fonctionnalités dans une bibliothèque. Alors lisez la documentation. Certaines utilisations sont très simples, tandis que parfois vous devrez décider quel "algorithme" pour le laisser utiliser, ou un tel. Encore une fois, ce que je fais est lire attentivement les manuels.
La version de base de "recadrage" est simple - vous venez de couper une partie de l'image. Dites, supprimez les 20 premières et dernières 20 colonnes et les 10 premières et dernières lignes, et à partir de la 120x60 initiale, vous obtenez une image de 80x40. Ceci est normalement fait lorsque les parties extérieures d'une image ont juste des zones blanches (ou, pire, noir!). Donc, vous voulez "découper" l'image elle-même de l'image entière. De nombreux outils graphiques peuvent le faire par eux-mêmes, en analysant l'image et en découvrant ces zones. Ou, nous sélectionnons et appuyons sur un bouton.
Serait-il utile d'utiliser le module Perl ['Image :: Magick'] (https://metacpan.org/pod/Image::Magick) si vous connaissez cette bibliothèque? C'est beaucoup plus flexible que "Imlib2". – Borodin