【问题标题】:What is the difference between cropping, resizing and scaling an image?裁剪、调整大小和缩放图像有什么区别?
【发布时间】:2017-06-10 15:24:34
【问题描述】:

我正在使用 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?,老实说什么都不懂。还有这个Image scaling

有人能解释这三个想法之间的区别吗?如果可能的话,可以举一些例子(最好用 Perl)来获得更好的结果吗?或者至少描述一下我想创建缩略图时应该考虑什么?

【问题讨论】:

  • 如果您熟悉该库,使用Image::Magick Perl 模块会有所帮助吗?它比Imlib2灵活得多。

标签: image perl image-resizing imlib2


【解决方案1】:

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

如果 x 或 y 为 0,则保留另一个给定的纵横比。

所以换行

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

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

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

由于这不是裁剪,我也更改了变量名称。

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


这是从被认为有帮助的 cmets 中汇总而来的。另请参阅 Borodin 的简短而明确的回答。

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

现在假设您想绘制另一个副本,只是更小一些。如果你把它做成 20x20,那将是完全不同的,因为它是一个正方形。让它“看起来一样”的最佳机会是选择 2 比 1 的比例(如 120x60),比如 40x20。这就是“纵横比”。但是仍然存在一个问题,因为现在您必须重新决定为每个盒子选择什么颜色,以便在该位置表示照片上“大部分”的内容。有算法(“采样”,请参阅您的第二个链接)。这与“调整大小”有关。得到的图纸的“质量”显然要差很多。

所以“调整大小”并不是那么简单。但是,对于我们这些用户来说,我们主要需要大致了解其中的内容,并了解如何在库中使用这些功能。所以阅读文档。有些用途非常简单,而有时您必须决定让它使用哪种“算法”,或者诸如此类。同样,我所做的是仔细阅读手册

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

【讨论】:

  • 感谢@zdim,非常感谢您提供这些无价的信息。
  • @zdim:所有这些文字都应该是你答案的一部分。
  • @Borodin 好的,谢谢你的建议。我不确定它是否属于正确的答案,稍后会合并它(现在很忙)。顺便说一句,你知道 -1 是什么意思吗?
  • 没关系。我不知道反对票可能是什么;因为你的 cmets 而贬低你是相当卑鄙的。
  • @marmeladze 感谢您的支持性评论。显然它被删除了(我猜是因为语言不正确)。我将这些 cmets 转移到了答案中。
【解决方案2】:

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

  • 您的原始图像为 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 模块,如果你想回到熟悉的地方

【讨论】:

    【解决方案3】:

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

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

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

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

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

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

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

    图片没有显示不正常,显示非常好。

    【讨论】:

    • 我真的不知道什么是正确的,什么不是。但是设计团队的某个人向我展示了调整大小后的图像应该是什么样子 - 他们真的很不一样 -))
    • 在缩放中最重要的是保持纵横比,正如 zdim 已经指出的那样。如果您以不同的方式缩放宽度和高度,则会扭曲图像,使其看起来很奇怪。在保持纵横比的同时使其更小,一旦像素太少,当然也会使图像看起来很奇怪/不好。这里也显示分辨率和尺寸变得很重要。邮票上的 50x50 像素可能看起来不错,但在电视上会看起来很糟糕。
    • 计算顺序应该是什么,才能达到最佳效果?获取宽度,获取高度,然后宽度减去高度的一半,高度减去宽度的一半,然后从该坐标开始裁剪图像?
    • @marmeladze 没有。这些奇怪的公式是从哪里来的?我什至不知道您想要什么,所以我无法告诉您如何实现“最佳外观效果”...您要裁剪还是缩放?这是两件不同的事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-11
    • 1970-01-01
    相关资源
    最近更新 更多