【问题标题】:Convert VERY large ppm files to JPEG/JPG/PNG?将非常大的 ppm 文件转换为 JPEG/JPG/PNG?
【发布时间】:2016-07-22 10:49:38
【问题描述】:

所以我编写了一个 C++ 程序,它可以生成非常高分辨率的图片(分形)。 我使用 fstream 将所有数据保存在 .ppm 文件中。

一切正常,但是当我进入非常高分辨率 (38400x21600) 时,ppm 文件大约有 8 GB。 然而,使用我的 16 GB 内存,我仍然无法转换该图片。我下载了几个转换器,但他们无法处理。当我尝试“导出为...”时,甚至 Gimp 也崩溃了。

那么,有谁知道可以处理非常大的 ppm 文件的好转换器吗?事实上,我什至想超过 100 GB。我不在乎它是否很慢,它应该可以工作。

如果没有这样的转换器:有没有更好的方式来 std::ofstream ?或许,有没有一个库可以自动生成 PNG 文件?

感谢您的帮助!

编辑:我还问自己保存这些大图像的最佳格式是什么。我研究过,JPEG 看起来很漂亮(尺寸小,质量仍然不错)。但是可能有更好的格式吗?让我知道。谢谢

【问题讨论】:

  • .ppm 效率极低。您可以使用 C++ 代码中的 libpng 或 libjpeg 直接写入所需的输出格式。
  • 也就是说,您是否尝试过 ImageMagick 的 convert 实用程序?总的来说,该捆绑包非常强大。
  • 不,我去看看。感谢您的帮助
  • ImageMagick 工作。谢谢!

标签: c++ image converter fstream ppm


【解决方案1】:

一些想法......

38400x21600 的 8 位 PPM 文件应占用 2.3GB。相同尺寸的 16 位 PPM 文件需要两倍,即 4.6GB,所以我不确定你从哪里得到 8GB。

VIPS 非常适合处理大图像,如果我采用 38400x21600 PPM 文件,并在终端中使用以下命令(即在命令行中),我可以看到它在 58MB 的 RAM 时达到峰值来执行从 PPM 转换为 JPEG...

vips jpegsave fractal.ppm fractal.jpg --vips-leak
memory: high-water mark 58.13 MB

在合理规格的 iMac 上这需要 31 秒,并从我的(随机)数据中生成一个 480MB 的文件,因此您会期望您的结果要小得多,因为我的数据是不可压缩的。

另一方面,ImageMagick 占用 1.1GB 的峰值工作集内存并在 74 秒内完成相同的转换:

/usr/bin/time -l convert fractal.ppm fractal.jpg

       73.81 real        69.46 user         4.16 sys
11616595968  maximum resident set size
         0  average shared memory size
         0  average unshared data size
         0  average unshared stack size
   4051124  page reclaims
         4  page faults
         0  swaps
         0  block input operations
       106  block output operations
         0  messages sent
         0  messages received
         0  signals received
         9  voluntary context switches
     11791  involuntary context switches

【讨论】:

  • 我试过 ImageMagick 并且成功了。即使它给了我关于显示图像的错误消息,它也会生成一个 PNG 文件(0.6 GB)。谢谢,我可以使用它。 (我也会尝试 VIPS)。
【解决方案2】:

转到 Baby X 资源编译器并下载 JPEG 编码器 savejpeg.c。它需要一个 rgb 缓冲区,该缓冲区必须在内存中保持平坦。破解它并替换为接受 16x16 块流的版本。然后编写自己的 ppm 加载程序,一次加载 16 像素高的条带。

现在系统将扩展到无法容纳在内存中的巨大图像。我不知道你将如何展示它们。但 JPEG 将符合规范。

https://github.com/MalcolmMcLean/babyxrc

【讨论】:

    【解决方案3】:

    我建议更有效和更快的解决方案是简单地获得更多 RAM - 如今 128GB 并不算贵(或增加交换空间)。

    【讨论】:

    • 我喜欢你的风格:-)
    猜你喜欢
    • 2015-01-12
    • 2018-08-05
    • 2011-04-30
    • 2012-12-22
    • 2021-10-05
    • 2012-09-15
    • 2012-12-15
    • 1970-01-01
    • 2011-01-18
    相关资源
    最近更新 更多