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

时间:2017-06-08 20:12:44

标签: image perl image-resizing imlib2

我正在使用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);
}

原始图片

Original image

生成的图片

Generated image

我第一次看图像告诉我出了问题。这可能是我对裁剪,调整大小和缩放的无知,但生成的图像在小屏幕上显示错误。

我读过What's the difference between cropping and resizing?,说实话,什么都不懂。这一个Image scaling

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

3 个答案:

答案 0 :(得分: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像素宽,并且计算其高度以保持原始宽高比。

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

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

这是从认为有用的评论中汇总而来的。另请参阅 Borodin 简短明了的答案。

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

现在想象你想要绘制另一个副本,只是更小。如果你使它20x20将是完全不同的,因为它是一个正方形。让它“看起来一样”的最好机会是选择2:1的比例(如120x60),所以说40x20。这就是“宽高比”。但是仍然存在一个问题,因为现在你必须重新决定每个盒子要选择什么颜色,以便代表那个地方照片上的“大部分”。有算法(“采样”,见第二个链接)。这与“调整大小”有关。所得图纸的“质量”显然必须更差。

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

“裁剪”的基本版本很简单 - 你只是切断了部分图片。比如说,删除第一列和最后一列以及底部和前10行,从最初的120x60开始,您将获得80x40的图片。这通常在图像的外部部分只有白色区域(或者更糟,黑色!)时完成。因此,您希望从整个图像中“剪切”图片本身。许多图形工具可以通过分析图像并找出这些区域来自行完成。或者,我们选择并点击一个按钮。

答案 1 :(得分:1)

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

  • 原始图片为752×500像素

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

  • 缩放是按比例更改图像的大小。将图片缩小十倍会导致图像为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模块,如果你更愿意回到熟悉的地方

答案 2 :(得分:0)

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

根据界面的不同,您必须为操作提供新尺寸或缩放系数。小于或大于1.0的因子会使图像变小或变大。较小的图像由子采样创建,较大的图像由插值创建。

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

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

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

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

因此,无论您的图像如何呈现,您都可以将其填充为50 x 50像素。在这种情况下,不仅要降低分辨率,还要改变宽高比。

图像显示不正确,显示效果非常好。