jcupitt / vips
libvips 图像处理库的高级接口。
Requires
- php: >=7.4
- ext-ffi: *
- psr/log: ^1.1.3|^2.0|^3.0
Requires (Dev)
- php-parallel-lint/php-parallel-lint: ^1.3
- phpdocumentor/shim: ^3.3
- phpunit/phpunit: ^9.5
- squizlabs/php_codesniffer: ^3.7
- v2.4.0
- v2.3.0
- v2.2.0
- v2.1.1
- v2.1.0
- dev-master / 2.0.x-dev
- v2.0.3
- v2.0.2
- v2.0.1
- v2.0.0
- 1.x-dev
- v1.0.10
- v1.0.9
- v1.0.8
- v1.0.7
- v1.0.6
- v1.0.5
- v1.0.4
- v1.0.3
- v1.0.2
- v1.0.1
- v1.0.0
- v0.1.2
- dev-use-source-and-target
- dev-fix-macos
- dev-add-progress
- dev-callback-experiment
- dev-add-throws-decls
- dev-vips-8.6
- dev-add-array-access
- dev-use-travis-containers
- dev-dev
This package is auto-updated.
Last update: 2024-09-09 10:24:34 UTC
README
php-vips
是对 libvips 8.7 及更高版本的一个绑定,它可以在 PHP 7.4 及更高版本上运行。
libvips 运行速度快,内存消耗小。在 vips-php-bench
仓库中,测试了 php-vips
与 imagick
和 gd
的性能。在这个测试中,在我的笔记本电脑上,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