裁剪、调整大小和缩放图像之间有什么区别?

What is the difference between cropping, resizing and scaling an image?

我正在使用 Perl 的 Image::Imlib2 包从较大的图像生成缩略图。

我以前用几个 ImageMagick 界面(PHP、Ruby、Python)完成过这样的任务,而且相对容易。我以前没有使用 Imlib2 的经验,而且我已经有很长时间没有用 Perl 写东西了,所以如果这看起来很幼稚,我很抱歉!

这是我目前尝试过的方法。它很简单,并假设缩放图像将保持纵横比,并且生成的缩略图将是原始图像的精确缩微副本。

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);
}

原图

生成的图像

我第一眼看到这张图片就知道出了点问题。这可能是我对裁剪、调整大小和缩放的无知,但生成的图像在小屏幕上显示错误。

我读过 What's the difference between cropping and resizing?, and honestly didn't understand anything. Also this one Image scaling

谁能解释一下这三个想法之间的区别,并在可能的情况下给出示例(最好使用 Perl)以获得更好的结果?或者至少描述一下我在创建缩略图时应该考虑什么?

您使用的代码未保留纵横比。来自 Image::Imlib2::create_scaled_image

If x or y are 0, then retain the aspect ratio given in the other.

所以换行

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

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

新图像的宽度为 50 像素,其高度计算为保持原始纵横比。

因为这不是裁剪,所以我也更改了变量名称。

至于其他问题,下面是评论的基本讨论。请搜索有关图像处理的教程。此外,主要图书馆的文档通常都有简短而好的解释。


这是根据认为有用的评论汇总的。另请参阅 Borodin 简短而明确的回答。

想象一下,你想用下面的方式自己画一张(一些漂亮的照片)。你画了一个网格,比方说,120(水平)乘 60(垂直)方框。所以 120 x 60、720 个盒子。这些是你的 "pixels,",每个你只能填充一种颜色。如果您要重新绘制的照片在某个地方是 "mostly" 蓝色,则将该像素着色为蓝色。等等。最终忠实重绘并不容易——像素越密集越好。

现在想象一下,您想再画一个副本,只是小一点。如果你把它做成 20x20 那将是完全不同的,因为它是一个正方形。达到 "look the same" 的最佳机会是选择 2 比 1 的比例(例如 120x60),比如 40x20。那是 "aspect-ratio." 但是还有一个问题,因为现在你必须重新决定为每个盒子选择什么颜色,以便代表照片上那个地方的 "mostly" 是什么。有一些算法("sampling," 看你的第二个 link)。这涉及到"resizing."得到的图"quality"显然要差很多

所以 "resizing" 并不是那么简单。但是,对于我们用户来说,我们最需要的是大致了解其中涉及的内容,并了解如何在库中使用这些功能。所以阅读文档。有些用途非常简单,而有时您必须决定让它使用哪个 "algorithm" 或其他用途。同样,我所做的是仔细阅读手册

"cropping" 的基本版本很简单——您只需剪掉图片的一部分。比如说,删除前 20 列和后 20 列以及底部和顶部 10 行,然后从最初的 120x60 得到一张 80x40 的图片。当图像的外部只有白色区域(或者更糟的是黑色!)时,通常会这样做。所以你想 "cut out" 从整个图像中提取图片本身。许多图形工具可以通过分析图像并找出这些区域来自行完成这项工作。或者,我们 select 然后点击一个按钮。

调整大小和缩放是一样的;您只需更改图像的大小。你可以把它变小或变大。

根据界面的不同,您必须为操作提供新维度或比例因子。小于或大于 1.0 的因子会使图像变小或变大。较小的图像由 二次采样 创建,较大的图像由 插值 .

裁剪非常简单。您 select 图像的矩形区域,这就是您的新图像。就像用剪刀一样。

在您的代码示例中,图像被命名为 cropped_image,尽管它是通过缩放或调整大小创建的。

输出图像是大小为 50 x 50 像素的图像。这就是你在这里所做的:

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

因此,无论您的图像以前看起来如何,您都将其塞入 50 x 50 像素。在这种情况下,不仅降低了分辨率,还改变了纵横比。

图片不是显示不正常,显示的很好。

我仍然不确定您是否理解这些术语之间的区别

  • 你的原图是 752 × 500 像素

  • 调整大小 是一个模糊的术语,只是意味着以某种方式使图片大小不同

  • 缩放是按比例改变图像的大小。将图片缩小 10 倍会得到 75 × 50 的图像(它应该是 75.2,但我们不能有 0.2 个像素)。放大它会使它变大

    您已缩放您的图片至 50 × 50 像素,垂直比例为 10 (500 ÷ 5),水平比例为 15 (752 ÷ 50),所以它看起来水平压扁(或垂直拉伸)

  • 裁剪是通过删除部分图像来缩小图像。要将图像裁剪为 50 × 50,您可以从整张图片中选择一个 50 × 50 的矩形并移除其余部分。这将是一个关于你的猴子鼻子大小的部分,但你可以选择你想要的任何区域

zdim 向您展示了如何调用

$image->create_scaled_image(0, 50)

以便高度或 y 维度减小到 50,而宽度或 x 维度按相同的系数缩放。这将导致如上所示的 75 × 50 的缩略图

希望对你有所帮助

正如我在评论中所说,有一个 Image::Magick Perl 模块,如果您希望回到熟悉的领域