Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image 裁剪、调整大小和缩放图像之间有什么区别?_Image_Perl_Image Resizing_Imlib2 - Fatal编程技术网

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

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/*

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

我以前用几个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);
}
原始图像

生成图像

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

我读过,老实说我什么都不懂。还有这个


有人能解释一下这三种想法之间的区别吗?如果可能的话,给出一些例子(最好是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的矩形,然后删除其余部分。这是一块和你猴子鼻子大小差不多的东西,但是你可以选择任何你想要的区域

zdim向您展示了如何拨打电话

$image->create_scaled_image(0, 50)
因此,高度或y维度将减少到50,而宽度或x维度将按相同的因子缩放。这将产生如上所述的75×50的缩略图

我希望这有帮助

正如我在报告中所说的
$image->create_scaled_image(0, 50)