我想请教如何构建一个非常低内存的图像调整程序,该程序将作为我的nodejs应用程序在linux中的子进程运行。
我需要的解决方案是一个Linux可执行文件,它将使用stdin接收客户端上传的base64字符串图像,将照片调整为指定的大小,然后通过stdout输出结果图像数据。
我已经研究了ImageMagick,可能会使用它,但我想问问是否有其他建议。
如果您能提供C/C++预编译可执行文件的库或示例,那将不胜感激。此外,有用的答案将包括低内存图像调整的一般策略。
谢谢
我想请教如何构建一个非常低内存的图像调整程序,该程序将作为我的nodejs应用程序在linux中的子进程运行。
我需要的解决方案是一个Linux可执行文件,它将使用stdin接收客户端上传的base64字符串图像,将照片调整为指定的大小,然后通过stdout输出结果图像数据。
我已经研究了ImageMagick,可能会使用它,但我想问问是否有其他建议。
如果您能提供C/C++预编译可执行文件的库或示例,那将不胜感激。此外,有用的答案将包括低内存图像调整的一般策略。
谢谢
djpeg
在解码时将图像写出而不在内存中保留它,而convert
在加载整个图像以进行缩放时,则是我认为它们的工作方式...)。 - R.. GitHub STOP HELPING ICE当处理像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密集(即解码图像,然后尝试调整大小)。
在性能方面,没有什么能够击败英特尔集成性能原语。如果你有能力的话,我强烈建议使用它。
否则,只需实现自己的调整大小例程。Lanczos可以得到相当不错的结果,尽管速度不会非常快。
编辑:我强烈建议您不要使用Image Magick或Graphics Magick。它们都是很棒的库,但是设计用于完全不同的目的——处理许多文件格式、深度、像素格式等。它们为我提到的这些事情牺牲了性能和内存效率。
如果有什么的话,这只是一个按照他所描述的样本:
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")
由于需要读取输入,解码、调整大小并重新编码和写出,因此无法将所使用的内存大小缩小到小于输入图像的大小。