低内存图像大小调整

Ska*_*ful 6 c c++ linux image-processing

我正在寻找一些关于如何构建一个非常低内存映像大小调整程序的建议,该程序将作为我在linux中的nodejs应用程序的子进程运行.

我正在寻找的解决方案是一个linux可执行文件,它将使用stdin获取base64字符串图像(从客户端上传),将照片大小调整为指定大小,然后通过stdout将生成的图像数据泵回.

我调查了图像magick,它可能是我最终使用的,但我想我会问,看看是否有人有一个建议.

我们非常感谢您对C/C++中的库或预编译可执行文件示例的建议.另外一个有用的答案将包括低内存图像大小调整的一般策略.

谢谢

R..*_*R.. 9

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

值得注意的是,通过简单地跳过高频系数并使用较小的IDCT,可以有效地执行缩小巨型jpeg的工作.例如,要以半宽半高解码,丢弃系数的左上象限(水平和垂直频率<4)以外的所有象限,并在它们上使用4x4 IDCT而不是通常的8x8.两个libjpeg解码器和libavcodec解码器支持此操作为幂的2的定标(1/2,1/4,或1/8).这种方法可能不需要增量解码/扩展.

你可以尝试一下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.

  • 它可能会使用更多(如果两个进程一次完全复制图像,2x)或更少(如果管道数据使图像整体保持在内存中),但可能大致相同(如果`djpeg`在解码它时将图像写出来而不将其保留在内存中,并且`convert`将整个内容加载到内存中以扩展它,这是我认为它们工作的方式..) (2认同)

hov*_*nko 6

当处理非常大的图像时,例如 0.25 GPix 和更大的图像,ImageMagick 使用 ~2 GB ram,即使首先使用 djpeg 解码 JPEG 图像也是如此。

此命令链将仅使用 ~3 MB ram 调整任何大小的 JPEG 图像的大小:

djpeg my-large.jpg | pnmscale -xysize 16000 16000 | cjpeg > scaled-large.jpg
Run Code Online (Sandbox Code Playgroud)