getgrav/image

图像处理

v3.0.1 2023-05-08 21:44 UTC

README

Build status paypal

Gregwar\Image类的作用是提供一个简单的面向对象的图像处理和缓存API。

安装

使用composer

{
    ...
    "require": {
        "gregwar/image": "2.*"
    }
}

使用方法

基本处理

使用方法链,您可以在一行中打开、转换和保存文件

<?php use Gregwar\Image\Image;

Image::open('in.png')
     ->resize(100, 100)
     ->negate()
     ->save('out.jpg');

以下是一些调整大小的方法

  • resize($width, $height, $background): 调整图像大小,将保留比例且不会放大(背景为红色以便理解所发生的情况)

resize()

  • scaleResize($width, $height, $background): 调整图像大小,将保留比例,可以放大(背景为红色以便理解所发生的情况)

scaleResize()

  • forceResize($width, $height, $background): 强制图像大小恰好为$width x $height

forceResize()

  • cropResize($width, $height, $background): 调整图像大小,保留比例(类似于resize())并裁剪空白部分

cropResize()

  • zoomCrop($width, $height, $background, $xPos, $yPos): 调整和裁剪图像以适应给定的尺寸

zoomCrop()

  • zoomCrop()中,您可以使用$xPos(中心、左或右)和$yPos(中心、顶部或底部)更改调整大小后的图像位置

zoomCrop() with yPos=top

其他可用的方法有

  • crop($x, $y, $w, $h): 将图像裁剪到坐标$x,y上的一个矩形框,大小为$w x $h

  • negate(): 反转图像颜色

  • brighness($b): 对图像应用亮度效果(从-255到+255)

  • contrast($c): 对图像应用对比度效果(从-100到+100)

  • grayscale(): 将图像转换为灰度

  • emboss(): 浮雕图像

  • smooth($p): 平滑图像

  • sharp(): 对图像应用均值移除过滤器

  • edge(): 对图像应用边缘效果

  • colorize($red, $green, $blue): 着色图像(每个颜色从-255到+255)

  • sepia(): 应用棕褐色效果

  • merge($image, $x, $y, $width, $height): 合并两个图像

  • fill($color, $x, $y): 用给定颜色填充图像

  • write($font, $text, $x, $y, $size, $angle, $color, $position): 在图像上写文本,$position可以是'left'、'right'或'center'之一

  • rectangle($x1, $y1, $x2, $y2, $color, $filled=false): 绘制矩形

  • rotate($angle, $background = 0xffffff) : 将图像旋转到指定角度

  • roundedRectangle($x1, $y1, $x2, $y2, $radius, $color, $filled=false): 绘制圆角矩形(半径可以是任何值)

  • line($x1, $y1, $x2, $y2, $color): 绘制线条

  • ellipse($cx, $cy, $width, $height, $color, $filled=false): 绘制椭圆

  • circle($cx, $cy, $r, $color, $filled=false): 绘制圆

  • fillBackground($bg=0xffffff): 将透明图像的背景填充为'bg'颜色

  • fixOrientation(): 根据图像EXIF信息旋转和翻转图像

  • applyExifOrientation(int $exif_rotation_value): 使用EXIF旋转值旋转和翻转图像

  • html($title = '', $type = 'jpg'): 返回带有缓存图像的<img ... />标签

  • flip($flipVertical, $flipHorizontal): 在给定方向上翻转图像。两个参数都是布尔值,至少必须有一个为真。

  • inline($type = 'jpg'): 返回可内联的HTML base64字符串(见demo/inline.php

您也可以使用以下方法从头创建图像

<?php
    Image::create(200, 100);

其中200是宽度,100是高度

保存图像

您可以使用save($file, $type = 'jpg', $quality = 80)将图像保存到显式文件

<?php
    // ...
    $image->save('output.jpg', 'jpg', 85);

您还可以使用get($type = 'jpg', $quality = 80)获取图像内容,这将返回图像的二进制内容

使用缓存

上述每个操作实际上并没有应用到打开的图像上,而是添加到一个操作数组中。这个操作数组、文件名称、类型和修改时间使用sha1()进行哈希处理,然后使用这个哈希值来查找缓存文件。

一旦配置了缓存目录,您就可以调用以下方法

  • jpeg($quality = 80):即时查找或创建JPEG缓存文件

  • gif():即时查找或创建GIF缓存文件

  • png():即时查找或创建PNG缓存文件

  • guess($quality = 80):猜测类型(使用与输入相同的类型)并即时查找或创建缓存文件

  • setPrettyName($prettyName, $prefix = true):为文件设置一个“漂亮”的名称后缀,如果您想使其更利于SEO。例如,如果您将其命名为“Fancy Image”,缓存将类似于something/something-fancy-image.jpg。如果$prefix传递为false(默认true),则漂亮名称不会有任何哈希前缀。如果您想使用非latin1漂亮名称,必须安装behat/transliterator包。

例如

<?php use Gregwar\Image\Image;

echo Image::open('test.png')
          ->sepia()
          ->jpeg();

//Outputs: cache/images/1/8/6/9/c/86e4532dbd9c073075ef08e9751fc9bc0f4.jpg

如果原始文件和操作没有改变,哈希值将是相同的,并且缓存将不会再次生成。

您可以直接在HTML文档中使用它

<?php use Gregwar\Image\Image;

// ...
<img src="<?php echo Image::open('image.jpg')->resize(150, 150)->jpeg(); ?>" />
// ...

这是强大的,因为如果您更改原始图像或任何代码,缓存哈希将改变,并且文件将被重新生成。

写入图像

您还可以使用绘图函数即时创建自己的图像

<?php 
    $img_src = Image::create(300, 300)
                    ->fill(0xffaaaa)    // Filling with a light red
                    ->rectangle(0xff3333, 0, 100, 300, 200, true) // Drawing a red rectangle
                      // Writing "Hello $username !" on the picture using a custom TTF font file
                    ->write('./fonts/CaviarDreams.ttf', 'Hello '.$username.'!', 150, 150, 20, 0, 'white', 'center')
                    ->jpeg();
?>
<img src="<?= $img_src  ?>" />

使用后备图像

如果图像文件不存在,您可以配置一个后备图像,该图像将由类使用(请注意,这需要缓存目录可用)。

默认的“错误”图像位于images/error.jpg,您可以通过以下方式更改它

<?php
    $img->setFallback('/path/to/my/fallback.jpg');

垃圾回收

为了防止缓存无限增长,您可以使用提供的GarbageCollect类如下

<?php use Gregwar\Image\GarbageCollect;

// This could be a cron called each day @3:00AM for instance
// Removes all the files from ../cache that are more than 30 days
// old. A verbose output will explain which files are deleted
GarbageCollect::dropOldFiles(__DIR__.'/../cache', 30, true);

开发

Gregwar\Image使用了PHP元编程范式,这使得它很容易增强。

处理图像的每个函数都是在一个适配器中实现的,这就是所有具体操作发生的地方。

Common适配器设计用来包含常见抽象操作,而特定适配器(如GD)设计用来包含针对底层层的特定操作。

您可以通过添加到相应的适配器中来添加您自己的方法。

<?php
    // In the adapter
    private function myFilter()
    {
        $this->negate();
        $this->sepia();
    }

这在Image上可以用来

<?php
    $image->myFilter();

您还可以编写自己的适配器,可以扩展此存储库中的一个,并通过调用setAdapter()来使用它

<?php
    $image->setAdapter(new MyCustomAdapter);

许可

Gregwar\Image在MIT许可证下,请阅读LICENSE文件以获取更多信息。不要犹豫,fork此存储库并自定义它!