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

2024-01-03

我正在使用 Perl 的Image::Imlib2 https://metacpan.org/pod/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);
}

原图

生成的图像

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

我读了裁剪和调整大小有什么区别? https://www.shutterstock.com/support/article/What-s-the-difference-between-cropping-and-resizing,老实说什么也听不懂。还有这个图像缩放 https://en.wikipedia.org/wiki/Image_scaling.

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


您使用的代码不保留纵横比。从图像::Imlib2::create_scaled_image http://search.cpan.org/~lbrocard/Image-Imlib2-2.03/lib/Image/Imlib2.pm#create_scaled_image_%28x,_y%29

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

所以换行

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

to

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

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

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

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


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

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

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

所以“调整大小”并不是那么简单。但是,对于我们用户来说,我们大多需要粗略地了解所涉及的内容,并了解如何在库中使用这些功能。所以阅读文档。有些用途非常简单,而有时您必须决定让它使用哪种“算法”或类似的算法。再说一遍,我所做的是仔细阅读手册.

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • Mojolicious:我应该使用一个还是多个 websocket?

    我正在自学 Mojolicious 和 websockets 到目前为止 我已经有了一个网页 它显示数据库中的行 并具有用于添加 删除和更新行以及选择用于排序的列的按钮 目前 它在每个按钮的 javascript onclick 处理程序中
  • 从函数返回哈希值的最佳 Perl 实践是什么?

    我正在考虑将哈希引用传递给函数或从函数返回数据的最佳实践 一方面 仅将输入值传递给函数并仅返回输出变量似乎很直观 然而 在 Perl 中传递哈希值只能通过引用来完成 因此有点混乱 而且似乎更有可能犯错误 另一种方法是在输入变量中传递引用 但
  • 加载远程图像

    在 Android 中 最简单的方法是什么 从远程服务器加载图像 将其显示在 ImageView 中 这是我在应用程序中实际使用的方法 我知道它有效 try URL thumb u new URL http www example com
  • Image.Save 异常“GDI+ 中发生一般错误。”保存到 MemoryStream 时

    我有一个服务器客户端应用程序 我想从服务器获取屏幕截图 但在线bitmap Save ms System Drawing Imaging ImageFormat Png 我得到这个例外 A generic error occurred in
  • 超大图像缩小后变得模糊

    这是我第一次尝试响应式设计 所以如果这是一个愚蠢的简单问题 请原谅 我创建了一个图像并将其最大宽度设置为不大于图像的实际宽度 因为我知道放大图像会导致模糊不清 我有点困惑的是 当我缩小窗口并且图像开始缩小时 它也变得模糊 这是正确的行为吗
  • 控制 HTML 中的图像加载顺序

    有没有办法控制网页上图像的加载顺序 我正在考虑尝试通过首先加载轻量级 加载 图形来模拟预加载器 有任何想法吗 Thanks 使用 Javascript 并填充图像src属性稍后 这 告诉浏览器链接到页面上的 URL 因此不会向服务器发送请求
  • 在哪里可以找到将现有 CPAN 模块转换为使用 Dist::Zilla 的简明指南?

    我曾多次阅读过相关文档和一些博客文章地区 齐拉 http search cpan org dist Dist Zilla 我从来没有对自己的理解充满信心 在回答另一个问题时 Ether 提出了转换的可能性地穴 SSLeay http sea
  • 将base64字符串转换为图像c#时出错

    我想在我的网页上显示图像 并单击应该下载的链接按钮 存储的图像文件以二进制格式存储在db中 将 base64 字符串转换为图像时显示错误 详细信息如下 帮助我找到合适的解决方案 谢谢 Error Code protected void Pa
  • 代码如何从 Android Gallery 加载图像

    我有用于从图库加载图像的代码 但我真的不明白它是如何工作的 这是代码 Override protected void onActivityResult int requestCode int resultCode Intent data s
  • 如何将MathJax公式转换为img

    Mathjax 现在在我的项目中运行良好 但有一个问题 有没有办法将MathJax的公式 纯html和css 转换成img文件 我可以保存 MathJax 可以配置为生成 SVG 看http docs mathjax org en late
  • 使用perl创建层次结构文件

    我的任务是使用 perl 创建父子层次结构文件 示例输入文件 制表符分隔 记录将以随机顺序排列在文件中 父项 可能出现在 子项 之后 S5 S3 S5 S8 ROOT S1 S1 S7 S2 S5 S3 S4 S1 S2 S4 77 S2
  • 我自己的而不是从其他网站借用的图像的正确 img src 是什么?

    在我的计算机上 保存 css 和 html 文件的文件夹还包含一些我想要插入到 html 中的图像 如果我从其他网站借用图像 我知道如何获取图像的 URL 如何获取文件夹中但尚未出现在互联网上的图像的 URL 我是否必须将图像上传到其他网站
  • 在 Perl 中如何打印到变量而不是文件?

    如何使用 Perl 打印到变量 我已经在一个程序上工作了一段时间 它记录了它的迭代的以非常详细的方式取得进展 print loghandle some message 但是 我还想有选择地将一些消息打印到不同的文件中 当然 我可以在代码中添
  • 伽马校正公式:.^(gamma) 或 .^(1/gamma)?

    我正在寻找一个简单的伽玛校正公式 适用于值在 0 到 255 之间的灰度图像 假设我的屏幕的伽玛值为 2 2 它是 LCD 屏幕 因此我可能需要使用更复杂的过程来估计它 但我们假设我的屏幕表现良好 以下哪一个公式是正确的 Corrected
  • 如何在C#中使用saveFileDialog保存图像? [复制]

    这个问题在这里已经有答案了 可能的重复 使用 savefiledialog 保存图像时出现问题 https stackoverflow com questions 11053398 issue while saving image usin
  • 是否可以在通过表单上传本地图像之前预览它们?

    更具体地说 我想使用一种带有一个或多个用于图像的文件输入字段的表单 当这些字段发生更改时 我想在将数据发送到服务器之前显示关联图像的预览 我尝试过多种 JavaScript 方法 但总是遇到安全错误 我不介意使用 java 或 flash
  • 如何在SQL Server数据库表列中存储图像[重复]

    这个问题在这里已经有答案了 我有一张名为FEMALE在我的数据库中 它有ID as Primary Key 它有一个Image column 我的问题是如何使用 SQL 查询存储图像 尝试一下 insert into tableName I
  • 当 sleep() 不能与闹钟配合使用时,我还能做什么“睡眠”?

    有许多文档说 您应该避免使用带有警报的睡眠 因为许多系统使用警报来实现睡眠 事实上 我正在遭受这个问题的困扰 那么 当 sleep 无法与闹钟配合使用时 有人可以帮助我 我还能做什么 睡眠 吗 我已经尝试过 Time HiRes 模块的 u
  • 如何在 Perl 中找到正则表达式匹配的位置?

    我需要编写一个接收字符串和正则表达式的函数 我需要检查是否有匹配并返回匹配的开始和结束位置 正则表达式已经由qr 该函数还可能收到一个 全局 标志 然后我需要返回所有匹配的 开始 结束 对 我无法更改正则表达式 甚至无法添加 用户可能使用的
  • Perl 三元条件运算符内部赋值问题

    我的程序中的这段 Perl 代码给出了错误的结果 condition a 2 a 3 print a 无论价值如何 condition就是 输出总是3 为什么呢 Perl 中对此进行了解释文档 http perldoc perl org p

随机推荐