使用node.js动态裁剪和调整图片大小

4
我在亚马逊EC2上运行一个node.js服务器。我收到了一个包含指向远程主机产品图像链接的大型csv文件中的数据。我想要在Amazon S3上裁剪并存储不同尺寸的图像。
如果可能的话,如何使用流来完成此操作,而无需将任何内容保存到磁盘上?

我考虑使用ImageMagick进行图像处理,但也开放于其他选择。 - Thomas
1
我不喜欢这个问题。关于你将来需要这些的用途,有太多我不理解的地方。你永远都不会储存它们吗?那似乎是毫无必要的浪费。 - jcolebrand
1
你还没有尝试过吗?为什么不先尝试一下,如果遇到问题再发问呢?(并在提问时附上代码。) - Fosco
2
我认为这个问题很好。显然他不知道从哪里开始,而且很明显他正在寻找如何实现这一目标的指导方针。+1 - Tom
@jcolebrand:“我想在Amazon S3上裁剪和存储不同尺寸的图像。” 我只想要从供应商处获得的图像以一个(大)尺寸为基础,调整大小以适应我的视图所需的尺寸。我不认为这是浪费资源。 - Thomas
@Fosco:Tom是对的,这是我在开始编写代码之前想要澄清的一般性问题。如果可能的话,我更喜欢使用流来完成,如果不行,我会采用imagemagick的方式。 - Thomas
1个回答

1

我认为你无法避免将全尺寸图像暂时保存到磁盘上,因为调整大小/裁剪等通常需要完整的图像文件。所以,我建议使用ImageMagick。


1
不过,你可以使用流来完成,但这要么需要大量的内存,要么需要大量的网络流量。在我看来,这并不值得。 - jcolebrand
你说得对;我想我是指你需要完整的图像来进行操作(无论是在磁盘上还是在内存中),所以使用流和内存缓冲区会很愚蠢,因为磁盘空间比RAM便宜。 - Daniel Dickison
保存到磁盘的问题在于它带来了行政开销。我甚至不确定大多数托管的Node.js服务是否能够处理它(这对我来说不是问题,只是说一下)。 - Thomas
@Thomas,不断流式操作的问题在于它会带来高强度的CPU和内存开销。你打算在VPS上进行这个操作,对吗?你是按CPU小时计费还是按“实例当前正在运行”的小时计费?如果按CPU小时计费,那么只需支付一次成本就可以了,这样更加合理。 - jcolebrand
2
简单的图像调整(即使是重采样)中没有任何绝对需要随机访问整个图像的东西。从算法的角度来看,这可以逐步完成。对于最简单的调整情况,“最近像素”缩小,您只需在给定行中删除每个第n个像素和每个第n行。显然,这根本不需要任何内存,只需要两个计数器。如果要放大图像或使用任何形式的重采样/插值,则情况会变得更加复杂,但即使在这种情况下,您所需的最大值也仅是保留最后n行(n = 重采样半径)。 - Aleksander Adamowski
关于是否存在任何Node.JS库可以逐步调整图像流大小而不将整个数据集加载到内存/磁盘中,我仍在寻找。也许有一天我会编写这样的库。似乎https://github.com/aheckmann/gm和https://github.com/LearnBoost/node-canvas(或者基于ImageMagick、GraphicsMagick或Cairo的其他任何库)都无法基于流处理方式处理图像,因为底层库似乎总是假定对图像数据具有完全随机访问权限。 - Aleksander Adamowski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接