mehr-it / levi-images
用于Laravel的图像处理和优化工具包
Requires
- php: >=7.3.0
- ext-fileinfo: *
- contao/imagine-svg: ^1.0
- imagine/imagine: ^1.2
- laravel/framework: ^5.8|^6.0|^7.0|^8.0
- spatie/image-optimizer: ^1.5
Requires (Dev)
- ext-imagick: *
- mockery/mockery: ^1.4
- orchestra/testbench: ^3.8|^4.0|^5.0|^6.0
- phpunit/phpunit: ^7.4|^8.4|^9.4
This package is auto-updated.
Last update: 2024-09-16 19:21:49 UTC
README
本包提供使用 Imagine 进行图像处理和使用 Spatie Image Optimizer 进行优化的功能。通过 Imagine-Vips 可用 Libvips 对Imagine的支持,并且通过 Imagine SVG 可用基本的SVG操作。
光栅图像处理可以使用不同的包作为后端,例如 imagick、gmagick、vips 和 gd。
Imagick 是如果需要 Imagine 的完整功能集的一个好选择。 Vips 更快且使用的内存更少,但需要单独的PHP扩展,并且缺少一些更高级的功能。
为了优化,必须在您的系统上安装额外的库。请参阅安装章节。
安装
您可以通过composer安装此包
composer require mehr-it/levi-images
测试您的安装
此库依赖于各种系统要求,以便所有功能都能正常工作。您可以使用以下命令检查已安装的组件
php ./artisan levi-images:test
安装优化工具
优化器使用您系统上可用的各种优化工具
您可以使用以下命令在Debian/Ubuntu上安装它们
sudo apt-get install jpegoptim sudo apt-get install optipng sudo apt-get install pngquant sudo npm install -g svgo@1.3.2 sudo apt-get install gifsicle sudo apt-get install webp
有关更多详细信息,请参阅 Spatie Image Optimizer。
安装libvips驱动程序
Libvips 是一个快速、多线程的图像处理库,其内存消耗远低于例如Imagick。
强烈推荐使用版本8.7或更高版本的libvips。使用旧版本的libvips不支持除90度倍数外的其他角度的 paste
和 rotate
。
不管libvips的版本如何,并不是所有Imagine功能都得到支持。有关详细信息,请参阅 Imagine-Vips。
您还需要版本1.0.8或更高版本的 php-vips-ext 扩展。您可以使用以下方法安装libvips驱动程序要求
-
安装libvips库和头文件。它位于linux包管理器、homebrew和MacPorts中,vips网站上有Windows二进制文件。例如,在Debian上
sudo apt-get install libvips-dev
-
安装二进制PHP扩展。您需要PHP开发环境来完成此操作,因为它将下载并构建扩展的源代码。例如,在Debian上
sudo apt-get install php-pear
然后下载并构建扩展
pecl install vips
您可能需要将
extension=vips.so
或等效内容添加到php.ini
中,请参阅pecl的输出。 -
安装 Imagine-Vips
composer require rokka/imagine-vips
用法
此包有三个图像处理部分。
-
光栅 提供了用于操作或转换为其他格式的加载或创建光栅图像的API。
-
矢量 提供了用于某些基本操作的加载矢量图像的API。
-
优化 提供了一个 API 来优化特定格式的图像。通常优化器会减小图像文件大小并优化加载过程,例如交错加载。
您可以通过使用 LeviImages
面板来访问所有 API,例如 LeviImages::raster()
。
光栅图像
可以通过以下方式访问光栅图像 API
LeviImages::raster()
它提供了三种不同的方法来打开图像
// open a file $im = LeviImages::raster()->open('path/to/file.png'); // load a string $im = LeviImages::raster()->load(/* image data as string */); // read from a resource $im = LeviImages::raster()->load(fopen('path/to/file.png', 'r'));
所有这些方法都返回一个 Imagine\Image\ImageInterface
实例,用于 Imagine 图像操作。
配置光栅图像驱动程序
具体的实现取决于您的系统上可用的后端以及您的驱动程序选择。默认情况下,会自动选择一个驱动程序。如果多个驱动程序可用,则首选 Imagick。但是,如果您更喜欢其他驱动程序,例如 Vips,您可以将默认驱动程序设置为另一个。
使用 php ./artisan vendor:publish
来发布包配置并设置所需的驱动程序
// levi-images.php return [ 'raster' => [ /* * Configures the raster image driver to use. Available options are "vips", "imagick", "gmagick" and "gd". If * "auto" is set, the first available driver is chosen. */ 'driver' => 'vips', ], ];
创建新的光栅图像
要从头创建一个新的光栅图像,只需调用 create()
并传递所需的尺寸和背景颜色
$size = new Box(100, 100); $bgColor = (new RGB())->color("ff0000", 1); // red $im = LeviImages::raster()->create($size, $bgColor);
导入(矢量)图像
有时您可能想使用由其他库创建的 Imagine 实例,或者导入矢量图像以与光栅图像合并。您可以轻松地通过调用 import()
来完成此操作。以下示例演示了如何合并矢量图像和光栅图像
$rasterImage = LeviImages::raster()->open('path/to/file.png'); $vectorImage = LeviImages::vector()->open('path/to/file.svg'); $imported = LeviImages::raster()->import($vectorImage); $rasterImage->paste($imported, new Point(0, 0))
注意: "gd"
驱动程序不支持加载矢量图像。
这会返回一个新的图像实例,您可以使用当前驱动程序使用它。
内部,导入的图像以兼容的格式导出,并使用当前驱动程序加载。
矢量图像
可以通过以下方式访问矢量图像 API
LeviImages::vector()
它提供了与光栅 API 相同的打开图像的方法。
// open a file $im = LeviImages::raster()->open('path/to/file.svg'); // load a string $im = LeviImages::raster()->load(/* image data as string */); // read from a resource $im = LeviImages::raster()->load(fopen('path/to/file.svg', 'r'));
所有这些方法都返回一个 Contao\ImagineSvg\Image
实例。尽管 Imagine SVG 实现了 Imagine\Image\ImageInterface
,但它只提供了一组有限的操作,并且一些行为与光栅图像略有不同。然而,一些基本操作,如缩放,是可用的,并且非常有用。
矢量图像 API 不提供创建新图像或从其他实例导入的方法。
优化
可以通过以下方式访问优化 API
LeviImages::optimizer()
优化器利用了安装在您系统上的不同优化库,并将它们应用于应优化文件。如果没有给定文件类型的优化库,则文件将静默保留。
优化图像文件
您可以使用 optimizeFile()
来优化图像文件。如果您不想修改原始文件,则可以将单独的输出路径作为第二个参数
// optimize file in place LeviImages::optimizer() ->optimizeFile('path/to/file.png'); // create a new optimized image file LeviImages::optimizer() ->optimizeFile('path/to/file.png', 'path/to/output.png');
优化资源
如果图像数据作为资源可用,则 optimizeResource()
处理图像,并返回一个新的资源,其中包含优化后的图像数据
$res = LeviImages::optimizer() ->optimizeResource(fopen('path/to/file.png', 'r'));
传递图像实例
如果您正在处理光栅或矢量图像对象,您可以直接将图像对象传递给 optimizeImage()
。但是,您必须指定所需的输出格式作为第二个参数。您将收到一个包含优化后图像数据的资源
$res = LeviImages::optimizer() ->optimizeImage($img, Optimizer::FORMAT_PNG);
注意: 矢量图像的唯一受支持输出格式是 Optimizer::FORMAT_SVG
。如果您需要光栅图像输出,请首先将其导入为光栅图像。
自定义优化器
如果您想使用自定义的优化器集或非默认优化设置,您可以设置一个解析器函数,该函数返回要使用的优化器
LeviImages::optimizer() ->setOptimizersResolver(function() { return [ new Jpegoptim([ '--max=85', '--strip-all', '--all-progressive', ]), return new Cwebp([ '-m 6', '-pass 10', '-mt', '-q 80', ]); ]; });
使用 setOptimizersResolver()
会改变全局优化器链。如果您只想更改单个优化的优化器,可以使用 useOptimizers()
创建一个包含给定优化器的新实例。
LeviImages::optimizer() ->useOptimizers([ new Jpegoptim([ '--max=90', ]), ] );
所有提供的优化器都必须实现 \Spatie\ImageOptimizer\Optimizer
接口。有关详细信息,请参阅 Spatie Image Optimizer。
过滤器
此库还包括一些用于栅格图像的过滤器。
许可协议
此软件包以 MIT 许可协议发布。
Imagine SVG 以 LGPL-3.0 或更高版本许可协议发布。