您使用的代码不保留纵横比。从图像::Imlib2::create_scaled_image http://search.cpan.org/~lbrocard/Image-Imlib2-2.03/lib/Image/Imlib2.pm#create_scaled_image_%28x,_y%29
如果x或y为0,则保留另一个中给出的纵横比。
所以换行
my $cropped_image = $image->create_scaled_image(50, 50);
to
my $scaled_image = $image->create_scaled_image(50, 0);
新图像的宽度为 50 像素,其高度经过计算以保持原始的纵横比。
由于这不是裁剪,我也更改了变量名称。
至于其他问题,下面是评论的基本讨论。请搜索有关图像处理的教程。此外,主要图书馆的文档通常都有简短而良好的解释。
这是根据认为有帮助的评论汇总的。另请参阅Borodin的答案简短而明确。
想象一下,您想按照以下方式自己画一张图(一些漂亮的照片)。例如,您绘制一个由 120 个(水平)x 60 个(垂直)框组成的网格。所以 120 x 60,720 个盒子。这些是您的“像素”,每个像素只能填充一种颜色。如果您重新绘制的照片在某个位置“大部分”是蓝色,则可以将该像素着色为蓝色。等等。最终忠实地重绘并不容易——像素越密集越好。
现在想象一下您想要绘制另一个副本,只是更小一些。如果你把它做成 20x20 那将会完全不同,因为它是一个正方形。使其“看起来相同”的最佳机会是选择 2 比 1 的比例(例如 120x60),例如 40x20。这就是“纵横比”。但仍然存在一个问题,因为现在您必须重新决定为每个框选择什么颜色,以便代表该位置照片上“主要”的内容。有一些算法(“采样”,请参阅您的第二个链接)。这涉及“调整大小”。得到的图纸的“质量”显然要差很多。
所以“调整大小”并不是那么简单。但是,对于我们用户来说,我们大多需要粗略地了解所涉及的内容,并了解如何在库中使用这些功能。所以阅读文档。有些用途非常简单,而有时您必须决定让它使用哪种“算法”或类似的算法。再说一遍,我所做的是仔细阅读手册.
“裁剪”的基本版本很简单——只需剪掉图片的一部分即可。比如说,删除前 20 列以及底部和顶部 10 行,然后从最初的 120x60 中得到一张 80x40 的图片。当图像的外部部分只有白色区域(或者更糟糕的是黑色!)时,通常会执行此操作。所以你想从整个图像中“剪掉”图片本身。许多图形工具可以通过分析图像并找出这些区域来自行完成此操作。或者,我们选择并点击一个按钮。