当前位置: 首页 > 知识库问答 >
问题:

Imagick setOption()与'示例:偏移'读取大图像只读取某些像素

孙胜泫
2023-03-14

我有一些非常大的图像(10,000 x 10,000),我想为它们创建小缩略图。不幸的是,我不能读取他们到内存使用Imagick(Imagemagick PHP),因为我运行内存溢出。

在Android设备上,当从磁盘加载位图时,有一个选项可以在将其加载到内存时对其进行下采样。这使我能够将图像的较小版本加载到内存中(通过仅读取每2或每4像素等),并避免庞大的文件破坏一切的问题。

我在想办法用imagick做类似的事情。我找到了setOption()函数,它允许我向imagemagick工具发送类似于命令行参数的参数。

其中一个选项是sample:offset,它说我可以给它一个几何定义。一种可能的几何定义是给它一个百分比,如25%,表示高度和宽度都按指定的百分比缩放

当我尝试加载一个png10988 x 5782并使用以下代码时,png仍然以完整大小加载到内存中(在我的本地主机上它几乎无法处理,但在服务器上内存不足):

$im = new \Imagick();
$im->setOption('sample:offset', '25%');
$im->readImage($path);

我使用setOption()正确吗?这是设置的正确选项吗?我需要不同的值吗?

以下是我尝试过的一些其他格式,它们似乎也没有任何效果:

$im->setOption('sample:offset', '25%+0+0');
$im->setOption('sample:offset', '700x700'); // to scale it down to 700 pixels by 700 pixels
$im->setOption('sample:offset', '700x700+0+0');

我已经能够使用$im-实现jpg文件的解决方案

共有1个答案

邓嘉致
2023-03-14

加载时收缩是JPEG加载库libjpeg的一项功能。这不是ImageMagick的功能。

这是可能的,因为JPEG图像的编码方式:它们被分成8x8像素块,JPEG编码该块的平均值,外加一组DCT系数。当你解码时,你可以得到8x8的平均值,然后只重建足够的块来制作4x4像素的版本(例如)。这就是为什么libjpeg提供1/8、1/4和1/2尺寸解码。ImageMagick使用jpeg: size选项公开了这个库功能。

PNG图像不是这样编码的。他们使用一个简单的预测器,并使用zlib将预测错误编码为一个巨大的数据流。你不能解码图像的一部分,也不能以较低的分辨率解码。

处理大型PNG图像的唯一方法是流式传输它们。解码(例如)10条像素扫描线,处理它们,写入输出,然后解码下一组扫描线。ImageMagick不这样工作,所以你需要的是不可能的。

正如我在上一个问题中所说的,我认为您需要一个流式图像处理库,比如libvips。

 类似资料:
  • 包的类提供读取和写入图像的方法。使用OpenCV,可以读取图像并将其存储在矩阵中(如果需要,可在矩阵上执行转换)。之后可以将处理后的矩阵写入文件。 类的方法用于使用OpenCV读取图像。 以下是此方法的语法。 它接受一个参数(文件名),一个字符串类型的变量,表示要读取的文件的路径。 下面给出了使用OpenCV库读取Java图像的步骤。 第1步:加载OpenCV本机库 使用方法加载OpenCV本机库

  • 我使用tess4j api来读取数字图像。 代码如下: 程序将数字读取为错误。无法找到问题。 输出: 1 1 3 251 问候,瓦苏

  • 问题内容: 我有一堆图像,格式类似于Cifar10(二进制文件,每个图像字节),一个接一个(STL-10数据集)。我打开的文件有138MB。 我试图阅读并检查包含图像的张量的内容,以确保阅读正确,但是我有两个问题- 是否加载整个文件,但是一次只提供一个输入?由于读取第一个字节应该相对较快。但是,该代码大约需要两分钟才能运行。 如何获得可显示格式的实际图像内容,或在内部显示它们以验证图像是否被正确阅

  • 问题内容: 我的项目中有一个图像文件。层次结构如下所示: 我正在尝试使用以下代码将Manling.png读入Manling.java: 我总是声明中得到一个,所以我认为 路径是错误的。我尝试将图像移动到 项目中的其他位置,并尝试更改文件路径(例如 。有任何想法吗? 如果您想要一个完整的可编译示例,请尝试以下示例: } Just set up the project like this, using

  • 问题内容: 佳能/尼康/其他相机将传感器的原始输出保存为某些专有格式(.CR2等)。是否有旨在读取它们并将其转换为可管理的BufferedImages的Java库? 在这里,我不需要关心完全可定制的转换(类似于ufraw或imagemagick),而是“可以正常工作”以渲染此类图像的简单预览的简单方法。 问题答案: 我去过你那里,我对你有感觉。最好的选择是使用基于Adobe或dcraw的程序自动创

  • 以下程序演示了如何将彩色图像作为BGR类型图像读取并使用JavaFX窗口显示。 在这里通过将标志传递给方法以及保存彩色图像路径的String来读取图像。 假定以下是上述程序中指定的输入图像。 读取图片转为BGR如下所示 -