低内存图像大小调整

我正在寻找一些build议,如何构build一个非常低的内存图像resize的程序,将作为我的nodejs应用程序在Linux中的subprocess运行。

我正在寻找的解决scheme是一个Linux可执行文件,将使用标准input的base64string图像(从客户端上传),resize的照片到指定的大小,然后通过标准输出结果的图像数据。

我已经看过图像magick ,这可能是我最终使用,但我想我会问,看看有没有人有一个build议。

C / C ++库的预编译可执行文件的库或者示例的build议将不胜感激。 另外一个有用的答案将包括低内存图像resize的一般策略。

谢谢

根据您想要支持的图像格式,几乎一定可以通过一次只解码几行来执行增量解码和缩放,并在写入输出后丢弃数据。 但是,它可能需要编写自己的代码或调整现有的解码器库来支持这种操作。

还值得注意的是,通过简单地跳过高频系数并使用更小的IDCT,可以有效地执行缩小巨型JPEG。 例如,要解码半高和半高,除了系数的左上象限(水平和垂直频率<4)以外,全部丢弃,并在其上使用4×4的IDCT,而不是通常的8×8。 libjpeg解码器和libavcodec解码器都支持2次幂(1/2,1 / 4或1/8)的幂运算。 这种方法可能不需要增量解码/缩放。

你可以用djpeg -scale 1/4 < src.jpg | cjpeg > dest.jpg来试试 djpeg -scale 1/4 < src.jpg | cjpeg > dest.jpg 。 如果你想要一个固定的输出尺寸,你可能会先用1/2,1/4或1/8中的任何一个按比例缩放到最接近想要的尺寸的位置,然后进行插值去做最后一步,例如djpeg -scale 1/4 < src.jpg | convert pnm:- -scale 640x480 dest.jpg djpeg -scale 1/4 < src.jpg | convert pnm:- -scale 640x480 dest.jpg

在处理非常大的图像(如0.25 GPix或更大)时,即使使用djpeg首先解码JPEG图像,ImageMagick也会使用〜2 GB的ram。

这个命令链将使用大约3 MB RAM来调整任何大小的JPEG图像的大小:

 djpeg my-large.jpg | pnmscale -xysize 16000 16000 | cjpeg > scaled-large.jpg 

GraphicsMagick通常是ImageMagick的更好的版本,我会看看。 如果你确实需要一些快速的东西,那么你可能想放弃一些类似于libjpeg的东西 – 当你说你想要一些非阻塞的IO时,你想要做的操作是相对CPU限制的(即解码图像,然后尝试调整大小它)。

如果有的话,这只是他描述的一个样本:

 import sys from PIL import Image import binascii import cStringIO x,y = sys.stdin.readline().strip().split(' ') x,y = int(x), int(y) img = Image.open(cStringIO.StringIO(binascii.b2a_base64(sys.stdin.read())).resize(x,y) img.save(sys.stdout, format="png") 

因为它必须读取输入,对其进行解码,调整大小和编码,并将其写出,因此无法将用于减少输入图像大小的内存大小

在性能方面,没有任何东西可以击败英特尔集成性能基元。 如果你能负担得起,我强烈建议使用它。

否则,只需执行您自己的调整大小例程。 Lanczos提供了相当好的结果,尽管它不会很快。

编辑:我强烈建议你不要使用图像Magick或图形Magick。 他们都是伟大的库,但设计为完全不同的目的 – 处理许多文件格式,深度,像素格式等,他们牺牲了我所提到的事情的性能和内存效率。

你可能需要这个: https : //github.com/zhangyuanwei/node-images

用于Nodejs的跨平台图像解码器(png / jpeg / gif)和编码器(png / jpeg)