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

时间:2013-03-05 10:21:08

标签: php image algorithm

我一直在寻找这个问题,但我找不到我想要的东西,所以这是我的问题:

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

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

对于大小合适的图像,您会怎么做?您无法将其作为浏览器提供服务,即使您确实将其加载到服务器中,也会占用所有服务器资源,因此您不会在此期间将服务器用于其他任何内容。

简短的回答是,将这种规模的图像作为RAM中的单个文件处理是不可能的,除非你有一台非常强大的专用机器,而不是别的。在20k x 20k像素的情况下,即使是简单的单色图像也需要400mb。扩展到任何有用的颜色深度,你只是为了保存图形而谈论数十亿字节的RAM,而在我们开始考虑实际使用它之前就是这样。

我认为解决方案是考虑到同样的问题,看看其他人做了什么。

使用该比例图像的真实应用程序(例如,映射应用程序或全景照片,如this one)将其图像存储为一系列小得多的块。每个块本身都是一个较小的图像。它们通常也为每个缩放级别分别设置了一组块。对于任何真实的服务器环境来说,处理单个海量图像文件是不可信的,但是较小的块使得浏览器和服务器的处理变得容易。服务器只是将块发送给当前视图中的用户;当用户滚动或缩放时,会发送更多块。

您的问题提到将较小的图像添加到较大的图像上的特定位置。再次,看看其他人如何做到这一点,谷歌地图和其他人使用分层系统处理这种事情。这些图层已建立并分别发送到浏览器。

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

答案 2 :(得分:0)

只保留一个简单的文件,而不是图像,并以任何自定义格式存储像素数据。 PHP有一个fseek功能,允许你跳转到文件中的任何位置,这样你就可以计算出所需的位置和数据。对它进行读/写。如果您的图像大小为W x H,并且每个像素占用3个字节,则文件中像素(X,Y)的地址将为(W * Y + X)* 3.