mehr-it/levi-images

用于Laravel的图像处理和优化工具包

v1.2.1 2021-12-16 12:16 UTC

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操作。

光栅图像处理可以使用不同的包作为后端,例如 imagickgmagickvipsgd

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度倍数外的其他角度的 pasterotate

不管libvips的版本如何,并不是所有Imagine功能都得到支持。有关详细信息,请参阅 Imagine-Vips

您还需要版本1.0.8或更高版本的 php-vips-ext 扩展。您可以使用以下方法安装libvips驱动程序要求

  1. 安装libvips库和头文件。它位于linux包管理器、homebrew和MacPorts中,vips网站上有Windows二进制文件。例如,在Debian上

    sudo apt-get install libvips-dev
  2. 安装二进制PHP扩展。您需要PHP开发环境来完成此操作,因为它将下载并构建扩展的源代码。例如,在Debian上

    sudo apt-get install php-pear

    然后下载并构建扩展

    pecl install vips

    您可能需要将 extension=vips.so 或等效内容添加到 php.ini 中,请参阅pecl的输出。

  3. 安装 Imagine-Vips

    composer require rokka/imagine-vips

用法

此包有三个图像处理部分。

  1. 光栅 提供了用于操作或转换为其他格式的加载或创建光栅图像的API。

  2. 矢量 提供了用于某些基本操作的加载矢量图像的API。

  3. 优化 提供了一个 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 或更高版本许可协议发布。