使用 PHP 自动将 3 个图像对齐和调整大小为一个小图像?

Posted

技术标签:

【中文标题】使用 PHP 自动将 3 个图像对齐和调整大小为一个小图像?【英文标题】:Automatically align and resize 3 images into a small image with PHP? 【发布时间】:2009-09-10 00:42:47 【问题描述】:

我不知道 php 是否可以做到这一点,但我想如果可以,这里有人会知道。我目前正在开展一个项目,用户可以在该项目中自定义要在整个站点中使用的全身主要头像。有一堆不同的脸、头发等透明 png 图像可以选择来制作他们的自定义头像。我的这个工作很好,但这是困难的部分。我希望能够使用面部、头发和胡须(如果是男性),并自动创建一个 80x80 的图像,用作论坛帖子等的小头像。

这有一些障碍。首先,所有的图像都是187x404的(大量的图像是透明的,角色的身体图像是通过图像堆叠来实现的,所以人脸图像实际上并没有那么大)。为此,必须有效地自动裁剪图像,以便移除所有额外空间,并在 80x80 点中显示实际的面部、头发或胡须部分。

第二个问题是一些头发或胡须(当放置在全尺寸面部图像上时)会超出 80x80 并被剪掉。因此,图像必须以全尺寸拼凑在一起,然后调整大小以适应 80x80。

我知道将 3 张图片合并为一张的基本方法 (Combine 2-3 transparent PNG images on top of each other with PHP),但我知道的仅此而已。如果我疯了,这是不可能的,那么告诉我。我可能过于复杂了,所以如果你看到了显然更容易实现这一点的方法,我很想听听。

【问题讨论】:

【参考方案1】:

我认为您需要先决定,裁剪、调整大小或两者结合(裁剪到更大的正方形并调整大小)。

无论如何,如果您已经将图像合二为一,那么所有三个选项都可以在 php.ini 中轻松完成。看看imagecopyresampled()。

【讨论】:

好吧,我认为这可能是最后一步,但我需要裁剪掉空白区域,然后调整大小。不知道我是怎么做的。 没有看到你的图片很难说,但我会尝试裁剪到标准尺寸,因为如果你想根据图片的内容进行不同的裁剪,你会有更多的工作并且你不同头像的脸会有不同的大小。【参考方案2】:

最简单的方法就是始终将脸部/头发/胡须放在图像的同一区域。然后把那个区域剪掉。

如果必须,您可以为每个图像存储额外的数据,指定图像中的一个矩形必须在小头像中可见。然后在您合成的所有图像中取这些矩形的最大末端,并将其裁剪+缩小到您的小头像大小。

但是,请注意,将 PNG 图像的大小调整几个像素(例如 83x83 -> 80x80)会大大降低质量,尤其是对于具有大量已定义边缘的图像。这是因为新图像中有很多像素[几乎]均匀地分布在原始图像的 4 个像素之间,而在边缘锐利的图像中,这会导致模糊。

因此,缩小图像以适合肖像不仅困难,而且会降低质量。我会剪掉胡须!

【讨论】:

【参考方案3】:

我可能过于简单化了,但你可以试试:

    跟踪预合成的最大面部尺寸。

    将合成图像输出到临时文件。

    对第 1 步中的最大值进行裁剪平方

    将裁剪后的图像部分调整为 80 x 80

【讨论】:

我该如何进行自动裁剪呢?不同的组合会有不同的高度和宽度。 编辑答案以反映不同初始面部尺寸(胡须)的需求 好的,我明白你在说什么,这在技术上是有效的。但是,如果组合图像不是最大尺寸,则最终头像图像将小于应有的尺寸。 在第一步中,我说要跟踪尺寸,以便您可能拥有 90 x 90 的面部图像,因此您在步骤 3 中使用“90”作为裁剪尺寸,或者面部图像是 120 x 120 b/c 的胡须,因此您在步骤 3 中使用“120”作为裁剪尺寸。

以上是关于使用 PHP 自动将 3 个图像对齐和调整大小为一个小图像?的主要内容,如果未能解决你的问题,请参考以下文章

如何根据屏幕大小调整按钮的图像和文本大小(自动布局)

图像 <a> 垂直和水平对齐中心并在两者中都使用 % 调整大小

图像视图autolayout从水平边缘固定到60pt,但自动刻度高度?

使用 next.js 调整窗口大小时无法居中我的图像

调整引导列大小时的对齐问题

在 PHP 中调整图像大小