2017-06-08 1 views
1

J'utilise le package Image::Imlib2 de Perl pour générer des vignettes à partir d'images plus grandes.Quelle est la différence entre recadrer, redimensionner et redimensionner une image?

J'ai déjà réalisé de telles tâches avec plusieurs interfaces ImageMagick (PHP, Ruby, Python) et c'était relativement facile. Je n'ai aucune expérience avec Imlib2 et il ya longtemps que j'ai écrit quelque chose en Perl, donc je suis désolé si cela semble naïf!

C'est ce que j'ai essayé jusqu'ici. Il est simple et suppose que la mise à l'échelle d'une image conservera le rapport d'aspect et que la miniature générée sera une copie miniature exacte de l'image originale.

use strict; 
use warnings; 

use Image::Imlib2; 

my $dir = 'imgs/*'; 

my @files = glob ($dir); 

foreach my $img (@files) { 
    my $image = Image::Imlib2->load($img); 
    my $cropped_image = $image->create_scaled_image(50, 50); 
    $cropped_image->save($img); 
} 

Image originale

Original image

Generated image

Generated image

Mon premier regard sur l'image me dit que quelque chose ne va pas. C'est peut-être mon ignorance sur le recadrage, le redimensionnement et la mise à l'échelle, mais l'image générée s'affiche mal sur les petits écrans.

J'ai lu What's the difference between cropping and resizing?, et honnêtement je n'ai rien compris. Aussi celui-ci Image scaling.

Quelqu'un pourrait-il expliquer les différences entre ces trois idées et, si possible, donner des exemples (de préférence avec Perl) pour obtenir de meilleurs résultats? Ou au moins décrire ce que je devrais considérer quand je veux créer des vignettes?

+0

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

Répondre

1

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.

+0

merci, je pense que cela va faire le travail. – marmeladze

+0

merci @zdim, vraiment merci pour ces informations inestimables. – marmeladze

+0

@zdim: Tout ce texte devrait faire partie de votre réponse. – Borodin

0

Le redimensionnement et la mise à l'échelle sont les mêmes; vous venez de changer la taille de l'image. Vous pouvez le rendre plus petit ou plus grand.

Selon l'interface, vous devez indiquer les nouvelles dimensions ou un facteur de mise à l'échelle pour l'opération. Un facteur inférieur ou supérieur à 1,0 rendrait l'image plus petite ou plus grande. Les images plus petites sont créées par sous-échantillonnage et les images plus grandes par interpolation.

Le recadrage est très simple. Vous sélectionnez une région rectangulaire d'une image et c'est votre nouvelle image. C'est comme utiliser des ciseaux.

Dans votre exemple de code, l'image est nommée cropped_image, bien qu'elle soit créée par redimensionnement ou redimensionnement.

L'image de sortie est une image de taille 50 x 50 pixels. C'est ce que vous avez fait ici:

my $cropped_image = $image->create_scaled_image(50, 50); 

Donc, peu importe la façon dont votre image avant de vous farcir en 50 x 50 pixels. Dans ce cas, non seulement réduire la résolution, mais aussi changer le rapport d'aspect.

L'image ne s'affiche pas correctement, elle s'affiche parfaitement bien.

+0

Je n'ai vraiment aucune idée de ce qui est correct, de ce qui ne l'est pas. mais quelqu'un de l'équipe de conception m'a montré ce que l'image redimensionnée devrait ressembler - et ils étaient vraiment différents -)) – marmeladze

+0

la chose la plus importante dans la mise à l'échelle est que vous maintenez le rapport d'aspect comme zdim déjà souligné. Si vous redimensionnez la largeur et la hauteur différemment, vous fausserez l'image et la rendra bizarre.le rendre plus petit tout en conservant le rapport d'aspect rendra bien sûr l'image bizarre/mauvaise une fois que vous aurez trop peu de pixels. ici aussi la résolution d'affichage et la taille deviennent importantes. 50x50 pixels sur un timbre pourrait sembler correct, sur une télévision, ils auront l'air terrible. – Piglet

+1

quel devrait être l'ordre de calcul, pour obtenir les meilleurs résultats? obtenir la largeur, obtenir la hauteur, puis la largeur moins la moitié de la hauteur, et la hauteur moins la moitié de la largeur et commencer à rogner l'image à partir de ces coordonnées? – marmeladze

1

Je ne suis toujours pas certain que vous comprenez la différence entre ces termes

  • Votre image originale est de 752 × 500 pixels

  • Redimensionnement est un terme vague qui signifie simplement faire un image d'une taille différente en quelque sorte

  • La mise à l'échelle consiste à modifier proportionnellement la taille d'une image. Si vous réduisez votre image d'un facteur dix, vous obtiendrez une image 75 × 50 (elle devrait être 75,2 mais nous ne pouvons pas avoir 0,2 pixel). Mise à l'échelle vers le haut le rendrait plus

    Vous avez échelle votre image à 50 × 50 pixels, ce qui est une échelle verticale de 10 (500 ÷ 5), mais une échelle horizontale de 15 (752 ÷ 50), il apparaît écrasé horizontalement (ou étiré verticalement)

  • Le recadrage consiste à réduire une image en en supprimant des parties. Pour recadrer votre image à 50 × 50, vous devez choisir un rectangle de 50 × 50 sur l'ensemble de l'image et supprimer le reste. Ce serait une pièce de la taille de votre nez de singe, mais vous pouvez choisir une région que vous souhaitez

zdim vous a montré comment vous pouvez appeler

$image->create_scaled_image(0, 50) 

de telle sorte que la hauteur, ou y-dimension, est réduit à 50, tandis que la largeur, ou x-dimension, est mise à l'échelle par le même facteur. Cela se traduira par une vignette 75 x 50 comme ci-dessus

J'espère que cela

Comme je l'ai dit dans mon commentaire, il y a un Image::Magick module Perl si vous préférez être de retour sur un terrain familier