jcupitt/vips

libvips 图像处理库的高级接口。

v2.4.0 2024-04-09 09:27 UTC

README

CI

php-vips 是对 libvips 8.7 及更高版本的一个绑定,它可以在 PHP 7.4 及更高版本上运行。

libvips 运行速度快,内存消耗小。在 vips-php-bench 仓库中,测试了 php-vipsimagickgd 的性能。在这个测试中,在我的笔记本电脑上,php-vips 的速度大约是 imagick 的四倍,并且内存消耗减少了 10 倍。

使用 libvips 的程序不直接操作图像,而是从源图像开始创建一系列图像处理操作的管道。当管道连接到目的地时,整个管道将一次性并行执行,通过一组小片段从源到目的地流式传输图像。

安装

您需要 安装 libvips 库。它在 Linux 软件包管理器中,homebrew 和 MacPorts 中都有,vips 网站上也有 Windows 二进制文件。例如,在 Debian 上

sudo apt-get install --no-install-recommends libvips42

(--no-install-recommends 阻止 Debian 安装大量额外软件包)

或者在 macOS 上

brew install vips

您需要 在您的 PHP 中启用 FFI,然后将 vips 添加到您的 composer.json

"require": {
    "jcupitt/vips" : "2.4.0"
}

由于 php-vips 目前还不支持预加载,因此您需要全局启用 FFI。这有一些安全影响,因为任何可以在您的服务器上运行 php 的人都可以使用它来调用他们可以访问的任何本地库。

当然,如果攻击者在您的 web 服务器上运行他们自己的 PHP 代码,您可能已经处于不利地位,不幸的是。

最后,在 php 8.3 及更高版本中,您需要禁用堆栈溢出测试。php-vips 在主线程之外执行 FFI 回调,这在 php 8.3.0 中至少会混淆这些检查。

添加

zend.max_allowed_stack_size=-1

到您的 php.ini

示例

#!/usr/bin/env php
<?php
require __DIR__ . '/vendor/autoload.php';
use Jcupitt\Vips;

// fast thumbnail generator
$image = Vips\Image::thumbnail('somefile.jpg', 128);
$image->writeToFile('tiny.jpg');

// load an image, get fields, process, save
$image = Vips\Image::newFromFile($argv[1]);
echo "width = $image->width\n";
$image = $image->invert();
$image->writeToFile($argv[2]);

运行

$ composer install
$ ./try1.php ~/pics/k2.jpg x.tif

请参阅 examples/。我们有一个 完整的格式化 API 文档集

工作原理

php-vips 使用 php-ffi 直接调用 libvips 二进制文件。它检查库二进制文件,并将找到的方法呈现为 Image 类的成员。

这意味着您看到的 API 依赖于 php-vips 在运行时找到的 libvips 库版本,而不是 php-vips。php-vips 文档假设您正在使用 libvips 库的最新稳定版本。

之前依赖二进制扩展而不是 php-ffi 的 php-vips 版本仍然可在 1.x 分支 中找到并得到支持。

API 简介

几乎所有方法都返回一个新的图像作为结果,因此您可以连锁调用它们。例如

$new_image = $image->more(12)->ifthenelse(255, $image);

将创建一个大于 12 的像素掩码,然后使用该掩码将像素设置为 255 或原始图像。

请注意,libvips 操作员始终创建新的图像,它们不会修改现有图像,因此在上面的行之后,$image 保持不变。

您可以使用长、双、数组和图像作为参数。例如

$image = $image->add(2);

将每个波段元素增加 2,或者

$image = $image->add([1, 2, 3]);

将 1 加到第一个波段,2 加到第二个波段,3 加到第三个波段。或者

$image = $image->add($image2);

将两个图像相加。或者

$image = $image->add([[1, 2, 3], [4, 5, 6]]);

从数组中创建一个 3x2 的图像,然后将该图像添加到原始图像中。

几乎所有方法都可以接受一个额外的最终参数:一个选项数组。例如

$image->writeToFile("fred.jpg", ["Q" => 90]);

php-vips 包含 API 文档。要从您的源代码重新生成这些文档,请输入

$ vendor/bin/phpdoc

并查看 docs/ 目录。

不幸的是,由于 php-doc 的限制,这些文档并未列出每个操作的所有选项。要获取完整的 API 描述,您需要查看主要的 libvips 文档

https://libvips.org/API/current

测试和安装

$ composer install
$ composer test
$ vendor/bin/phpdoc

重新生成自动文档

$ cd src
$ ../examples/generate_phpdoc.py