Grafika是一個PHP影像處理庫,是基於Imagick和GD,可以用於改變圖片大小,剪裁,比較,新增水印等等功能。還有感知雜湊,高階影像過濾,繪製貝塞爾曲線等功能,功能非常強大。優點:縮圖的速度非常快,質量非常高、支援智慧剪裁、很好的支援GIF圖片、5種縮圖模式、影像對比功能、影像高階過濾功能、影像混合、其他影像處理庫支援的API基本都支援
一、 環境需求
- PHP >= 5.3,當然官方推薦php7
- GD庫 >= 2.0版本
Imagick
最好(不強求)>=3.3.0 , ImageMagick
>= 6.5.3
二、 安裝及配置
composer require kosinix/grafika:dev-master --prefer-dist
三、常用 API 及用法
建立編輯器
Create Editor
編輯器用於處理影像,官方建議使用 Grafika::createEditor()
建立 ,Grafika
會自動選擇可用的最佳編輯器(將檢查Imagick是否可用,如果沒有就會使用GD)
use Grafika\Grafika;
$editor = Grafika::createEditor();
Imagick Editor()
當然也可直接使用 Imagick
類庫
use Grafika\Imagick\Editor;
$editor = new Editor();
注意:在使用 Imagick 編輯器時因為某些PHP安裝預設情況下沒有Imagick編輯器,需要新增一些安全檢查:
use Grafika\Imagick\Editor;
$editor = new Editor();
if( $editor->isAvailable() ) {
}
- GD Editor 也可直接使用GD庫,也有些情況可能不支援,注意檢查
use Grafika\Gd\Editor;
$editor = new Editor();
if( $editor->isAvailable() ) {
}
建立影像,Grafika允許使用4種方式建立一個待處理的影像
use Grafika\Grafika;
$editor = Grafika::createEditor();
$editor->open( $image, 'images/foo.jpg');
use Grafika\Grafika;
$editor = Grafika::createEditor();
$image = Grafika::createImage('images/foo.jpg');
use Grafika\Grafika;
$image = Grafika::createBlankImage(100,100);
$copy = clone $image;
縮放
resizeFit()
等比例縮放,調整影像大小以適應給定的寬度和高度,重新調整大小的影像不會超過給定的尺寸,如果要保留寬高比,則此選項非常有用
resizeFit ( ImageInterface &$image, int $newWidth, int $newHeight ): EditorInterface
引數 |
描述 |
---|
image |
基礎圖片 |
newWidth |
新的寬度 |
newWidth |
新的高度 |
use Grafika\Grafika;
$editor->open( $image, "images/foo.jpg" );
$editor->resizeFit( $image, 200, 200 );
$editor->save( $image, "images/testResizeFit.jpg");
resizeExact()
固定尺寸縮放,調整影像大小以精確尺寸,會忽略寬高比。
resizeExact ( ImageInterface &$image, int $newWidth, int $newHeight ): EditorInterface
引數 |
描述 |
---|
image |
基礎圖片 |
newWidth |
新的寬度 |
newWidth |
新的高度 |
use Grafika\Grafika;
$editor->open( $image, "images/foo.jpg" );
$editor->resizeExact( $image, 200, 200 );
$editor->save( $image, "images/testResizeExact.jpg");
resizeExactWidth()
等寬縮放,高度自動計算
resizeExactHeight()
等高縮放,寬度自動計算
resizeFill()
縮放裁剪,調整影像大小以填充給定維度中的所有空間,多餘的部分被裁切。
resizeFill ( ImageInterface &$image, int $newWidth, int $newHeight ): EditorInterface
引數 |
描述 |
---|
image |
基礎圖片 |
newWidth |
新的寬度 |
newWidth |
新的高度 |
use Grafika\Grafika;
$editor->open( $image, "images/foo.jpg" );
$editor->resizeFill( $image, 200, 200 );
$editor->save( $image, "images/testResizeFill.jpg");
$editor = Grafika::createEditor();
$editor->open( $image, "images/foo.png" );
$editor->resizeFit($image, 200, 200);
header('Content-type: image/png');
$image->blob('PNG');
compare()
圖片相似度對比,返回值越接近於0表示圖片越相似,如果數字在0-10範圍內那麼圖片都可能相似,果數字大於10那麼可能就完全不同。
compare(string|ImageInterface $image1, string|ImageInterface $image2): int
引數 |
描述 |
---|
image1 |
圖片1 |
image2 |
圖片2 |
use Grafika\Grafika;
$editor = Grafika::createEditor();
$result = $editor->compare('images/foo-gray.png' , 'images/foo.png');
blend()
圖片合併,將兩張影像合併,第一張影像作為基礎,第二張影像位於基礎之上,支援多種混合模式。
blend(ImageInterface &$image1, ImageInterface $image2, string $type = 'normal', float $opacity = 1, string $position = 'top-left', int $offsetX = 0, int $offsetY = 0): EditorInterface
引數 |
描述 |
---|
image1 |
基礎圖片 |
image2 |
放置在基礎圖片之上的圖片 |
type |
圖片疊加模式,值為:normal、multiply,、overlay 、 screen |
opacity |
圖片2的不透明度,取值範圍為0.0到1,預設為1 |
position |
圖片2在圖片1上的位置,值為:top-left、op-center、top-right、center-left、 center、 center-right、 bottom-left、bottom-center、bottom-right 、 smart,預設為 top-left,smart 表示 grafika 來判斷擺放在哪裡好 |
offsetX |
圖片2距離圖片1左邊的距離 |
offsetY |
圖片2距離圖片1上邊的距離 |
use Grafika\Grafika;
$editor = Grafika::createEditor();
$editor->open($image1 , 'images/foo-h.jpg');
$editor->open($image2 , 'images/foo.jpg');
$editor->blend ( $image1, $image2 , 'normal', 0.9, 'center');
$editor->save($image1,'images/foo-blend.jpg');
rotate(ImageInterface &$image, int $angle, Color|null $color = null): EditorInterface
引數 |
描述 |
---|
image |
基礎圖片 |
angle |
角度 |
color |
背景色 |
use Grafika\Grafika;
use Grafika\Color;
$editor = Grafika::createEditor();
$editor->open($image , 'images/foo.png');
$editor->rotate($image ,'45',new Color('#ff0000'));
header('Content-type: image/png');
$image->blob('PNG');
text (ImageInterface &$image, string $text, int $size = 12, int $x = 0, int $y = 12, Color $color = null, string $font = '', int $angle = 0): EditorInterface
引數 |
描述 |
---|
image |
圖片 |
text |
文字 |
size |
字型大小(可選),預設為12px |
x |
從影像左邊緣到文字左邊緣的距離(可選),預設為0 |
y |
從影像上邊緣到文字基線的距離(可選),預設值為12(等於字型大小),以便將文字放置在影像中 |
color |
字型顏色(可選),預設為黑色 |
font |
字型路徑(可選) |
angle |
文字旋轉角度(可選),取值範圍為0-359,預設為0 |
use Grafika\Grafika;
use Grafika\Color;
$editor = Grafika::createEditor();
$editor->open($image , 'images/foo.jpg');
$editor->text($image ,'foo',30,200,100,new Color("#000000"),'',45);
$editor->save($image,'images/foo-text.jpg');
$editor = Grafika::createEditor();
$editor->open($image , 'images/foo.png');
$editor->text($image, '測試文字', 24, 50, 50, new Color("#000000"), 'images/Alibaba-PuHuiTi-Light.ttf',90);
header('Content-type: image/png');
$image->blob('PNG');
*getWidth()
獲取圖片寬度
getWidth (): int
use Grafika\Grafika;
$editor = Grafika::createEditor();
$editor->open( $image, 'images/foo.jpg' );
$image->getWidth();
getHeight()
獲取高度 、getImageFile()
獲取名稱 getType()
獲取型別isAnimated
是否是動圖
引數 |
描述 |
---|
point1 |
起始點的座標(陣列) |
point2 |
結束點的座標(陣列) |
thickness |
寬度,其中GD庫會忽略掉,預設為1 |
color |
顏色,預設為黑色 |
$editor = Grafika::createEditor();
$editor->open($image , 'images/foo.jpg');
$drawingObject = Grafika::createDrawingObject('Line', [0, 0], [200, 200], 1, new Color('#FF0000'));
$editor->draw( $image, $drawingObject );
header('Content-type: image/png');
$image->blob('PNG');
引數 |
描述 |
---|
width |
寬度 |
height |
高度 |
pos |
位置[x,y] ,X 為橢圓最左邊距離影像最左邊值,Y最上邊距離圖形最上邊值 |
borderSize |
邊寬度,0表示無邊框,預設為1 |
borderColor |
邊顏色,NULL 表示無邊框顏色,預設為黑色 |
fillColor |
填充顏色,NULL 表示無填充顏色,預設為白色 |
$drawingObject = Grafika::createDrawingObject('Ellipse', 100, 50, [50, 75], 1, new Color('#000000'), new Color('#FF0000'));
$editor->draw( $image, $drawingObject );
引數 |
描述 |
---|
width |
寬度 |
height |
高度 |
pos |
位置[x,y] ,X 為矩形最左邊距離影像最左邊值,Y 為矩形最上邊距離影像最上邊值,預設為 [0,0] |
borderSize |
邊寬度,0表示無邊框,預設為1 |
borderColor |
邊顏色,NULL 表示無邊框顏色,預設為黑色 |
fillColor |
填充顏色,NULL 表示無填充顏色,預設為白色 |
$drawingObject = Grafika::createDrawingObject('Rectangle', 85, 50,[105, 70], 0, null, new Color('#00FF00'));
$editor->draw( $image,drawingObject );
$editor = Grafika::createEditor();
$editor->open($image , 'images/foo.png');
$drawingObject = Grafika::createDrawingObject('Line', [5, 145], [190, 145], 1, new Color('#FF0000'));
$editor->draw($image, $drawingObject);
header('Content-type: image/png');
$image->blob('PNG');
引數 |
描述 |
---|
points |
多邊形角的座標 [[0, 0], [50, 0], [0, 50]] ,至少有三個 |
borderSize |
邊寬度,0表示無邊框,預設為1 |
borderColor |
邊顏色,NULL 表示無邊框顏色,預設為黑色 |
fillColor |
填充顏色,NULL 表示無填充顏色,預設為白色 |
$drawingObject = Grafika::createDrawingObject('Polygon', [[100, 0], [140, 50], [100, 100], [60, 50]], 1, NULL, new Color('#FF0000'))
$editor->draw( $image,drawingObject );
blob(string|ImageType $type): void
引數 |
描述 |
---|
type |
圖片格式 GIF、JPEG、PNG、WBMP |
use Grafika\Grafika;
$editor = Grafika::createEditor();
$editor->open( $image, 'images/foo.jpg' );
header('Content-type: image/png');
$image->blob('PNG');
save(ImageInterface $image, string $file, null|string $type = null, null|string $quality = null, bool $interlace = false, int $permission = 0755): EditorInterface
引數 |
描述 |
---|
image |
圖片 |
file |
儲存路徑 |
type |
影像格式,可以為空,gif、png或jpeg,如果為空,將根據$file中的輸出檔名選擇適當的格式 |
quality |
影像質量,僅適用於JPEG,範圍為數字0-100,其中0是最低的,100是最高的質量,預設為空,如果空值為75,則為預設質量 |
interlace |
設定為漸進式JPEG,僅適用於JPEG,預設為false |
permission |
目錄不存在時建立目錄的預設許可權,預設值為0755 |
$editor->open($image, 'images/foo.png');
$editor->save($image, 'images/output.png', null, null, false, 0777);
本作品採用《CC 協議》,轉載必須註明作者和本文連結