Image 裁剪、调整大小和缩放图像之间有什么区别?
我正在使用Perl的 包从较大的图像生成缩略图 我以前用几个ImageMagick接口(PHP、Ruby、Python)完成过这样的任务,而且相对简单。我以前没有使用Image 裁剪、调整大小和缩放图像之间有什么区别?,image,perl,image-resizing,imlib2,Image,Perl,Image Resizing,Imlib2,我正在使用Perl的 包从较大的图像生成缩略图 我以前用几个ImageMagick接口(PHP、Ruby、Python)完成过这样的任务,而且相对简单。我以前没有使用Imlib2的经验,而且我已经很久没有用Perl写过东西了,所以如果这看起来很幼稚,我很抱歉 这就是我到目前为止所尝试的。它很简单,并且假设缩放图像将保持纵横比,并且生成的缩略图将是原始图像的精确缩微副本 use strict; use warnings; use Image::Imlib2; my $dir = 'imgs/*
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);
}
原始图像
生成图像
我第一眼看到这张图片就知道出了问题。这可能是我对裁剪、调整大小和缩放的无知,但生成的图像在小屏幕上显示错误
我读过,老实说我什么都不懂。还有这个
有人能解释一下这三种想法之间的区别吗?如果可能的话,给出一些例子(最好是Perl),以获得更好的结果?或者至少描述当我想创建缩略图时应该考虑什么? 你使用的代码不是保存纵横比。从 如果x或y为0,则保留另一个中给出的纵横比 那就换线吧
my $cropped_image = $image->create_scaled_image(50, 50);
到
新图像将是50像素宽,并计算其高度,以保持原始纵横比
因为这不是裁剪,所以我也更改了变量名
至于其他问题,以下是评论中的基本讨论。请搜索有关图像处理的教程。此外,主要图书馆的文档通常有简短而好的解释
这是根据被认为有用的评论汇总而成的。另请参见Borodin的简短而清晰的回答 想象一下,你想用下面的方法自己画一幅画(一张漂亮的照片)。您可以绘制一个网格,例如,120(水平方向)乘以60(垂直方向)的长方体。120 x 60,720盒。这些是您的“像素”,每个像素只能填充一种颜色。如果您正在绘制的照片在某个点上“大部分”为蓝色,则将该像素涂成蓝色。等等。要以忠实的重画结束并不容易——像素越密集,效果就越好 现在想象一下,你想画另一个副本,只是更小。如果你把它做成20x20,那将是完全不同的,因为它是一个正方形。让它看起来“一样”的最好机会是选择2:1的比例(比如120x60),比如说40x20。这就是“纵横比”。但仍然存在一个问题,因为现在你必须重新决定为每个框选择什么颜色,以表示在该点的照片上“大部分”是什么。这里有一些算法(“采样”,参见第二个链接)。这涉及到“调整尺寸”。获得的图纸的“质量”显然要差得多 所以“调整大小”并不是那么简单。但是,对于我们用户来说,我们主要需要大致了解所涉及的内容,并了解如何在库中使用这些功能。所以请阅读文档。有些用法非常简单,但有时您必须决定让它使用哪种“算法”,或者类似的方法。同样,我所做的是仔细阅读手册
“裁剪”的基本版本很简单——你只需剪掉图片的一部分。比如说,去掉第一列和最后20列以及底部和顶部的10行,从最初的120x60可以得到80x40的图片。这通常是在图像的外部只有白色区域(或者更糟的是,黑色!)时完成的。因此,您希望从整个图像中“剪切”图片本身。许多图形工具可以通过分析图像并找出这些区域,自己完成这项工作。或者,我们选择并点击一个按钮。调整大小和缩放是相同的;您只需更改图像的大小。你可以把它变小或变大 根据界面的不同,必须为操作提供新的尺寸或比例因子。小于或大于1.0的因子将使图像变小或变大。较小的图像通过子采样创建,较大的图像通过插值创建 裁剪非常简单。选择图像的矩形区域,这就是新图像。就像用剪刀一样 在您的代码示例中,图像名为
cropped\u 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的矩形,然后删除其余部分。这是一块和你猴子鼻子大小差不多的东西,但是你可以选择任何你想要的区域
$image->create_scaled_image(0, 50)
因此,高度或y维度将减少到50,而宽度或x维度将按相同的因子缩放。这将产生如上所述的75×50的缩略图
我希望这有帮助
正如我在报告中所说的
$image->create_scaled_image(0, 50)