PHP,操作非常大的图像文件,而不将它们加载到RAM中


PHP, manipulating very big image files without loading them into RAM

我已经搜索了一段时间,但我没有找到我想要的,所以这是我的问题:

使用PHP,我想创建一个非常大的图像文件,比如20000亿像素,然后我想在这个大图像的特定位置添加一个小图像。我的计算机没有足够的RAM来加载整个图像并以这种方式操作像素,所以我认为我需要访问硬盘上的图像数据并以某种方式操作它们,所以有人知道如何做到这一点吗?谢谢你的帮助:)

ImageMagick支持对非常大的文件进行操作。我没有看到PHP/ImageMagick API支持,但你可以调用(exec)命令行程序,并使用它的磁盘缓存或流选项之一。

这里有一些处理大文件的文档:www.imagemagick.org.

你会怎么处理这么大的图片?你不能在浏览器中提供它,即使你设法将它加载到服务器中,它也会占用所有的服务器资源,所以在此期间你不会使用服务器做任何其他事情。

简短的回答是,处理这种规模的映像作为RAM中的单个文件是不可能的,除非您有一台非常强大的机器专门用于此,而没有其他。在20k x 20k像素下,即使是简单的单色图像也需要400mb。把它放大到任何有用的颜色深度,你谈论的是千兆字节的内存,只是为了保存图形,这是在我们甚至开始考虑实际处理它之前。

我想解决办法是看看别人在遇到同样的问题时是怎么做的。

使用这种比例图像的实际应用程序(例如地图应用程序或像这样的全景照片)将其图像存储为一系列更小的块。每个块本身就是一个较小的图像。他们通常也会为每个缩放级别设置单独的块。对于任何实际的服务器环境来说,处理单个大容量图像文件都是不可能的,但是对于浏览器和服务器来说,处理较小的块会更容易。服务器只是将当前视图中的block发送给用户;当用户滚动或缩放时,他们会收到更多的块。

你的问题提到在大图的特定位置添加一个较小的图像。再一次,看看其他人是怎么做的,谷歌地图和其他使用分层系统处理这类事情。各层分别构建并发送给浏览器。

我知道这并不能直接回答问题,但我希望它能给你一些思考的选择。

只保留一个简单的文件,而不是图像,并以任何自定义格式存储像素数据。PHP有一个fseek函数,它允许您跳转到文件中的任何位置,因此您可以计算所需的位置&对其执行读/写操作。如果你有一个大小为W x H的图像,并且如果每个像素占用3个字节,那么文件中像素(x, Y)的地址将是(W * Y + x) * 3。