PHP圖片處理庫Grafika詳細教程(1):圖像基本處理

2020-12-08 TechWeb

Grafika是一個PHP圖像處理庫,是基於Imagick和GD,可以用於改變圖片大小,剪裁,比較,添加水印等等功能。還有感知哈希,高級圖像過濾,繪製貝塞爾曲線等功能,可謂非常強大。

由於功能太多,所以分成幾篇文章寫。

《1、圖像基本處理》

《2、圖像特效處理模塊》

《3、圖像屬性處理》

《4、圖形繪製》

優點:

縮略圖的速度非常快,質量非常高 支持智能剪裁 很好的支持GIF圖片 5種縮略圖模式 圖像對比功能 圖像高級過濾功能 圖像混合 其他圖像處理庫支持的API基本都支持

安裝

下載

1、直接下載:

Grafika的官網、Github地址

2、composer:

composer require kosinix/grafika:dev-master --prefer-dist 

環境需求

PHP >= 5.3,當然官方推薦php7 GD庫 >= 2.0版本 Imagick最好(不強求)>=3.3.0 , ImageMagick >= 6.5.3

部署

下載下來的Grafika目錄基本結構像下面這樣:  

不過composer下載下來的多一點兒,你只需要使用kosinix/grafika目錄下的東西就好了。

我們在grafika目錄下建立一個index.php,之後的操作都在這裡。

grafika給我們提供了一個非常好用的autoloader.php位於src目錄下。

在index.php中引入它,(說明下,以下示例都需要引入這個autoloader.php文件,我們默認省略),下面就可以直接開發了。

require_once 'src/autoloader.php'; 

創建Editors

1、createEditor

grafika通過靜態方法createEditor來創建一個editor。它包含所有的圖片處理方法。

由於,grafika是基於Imagick和GD庫,所以使用createEditor方法會根據當前情況,自動選擇所需要的圖片處理庫。(推薦使用)

use GrafikaGrafika; // Import package $editor = Grafika::createEditor(); // Create the best available editor  

2、Imagick Editor

當然你也可以直接使用Imagick類庫。

use GrafikaImagickEditor; // Import package $editor = new Editor(); // Imagick editor  

注意:有些情況可能不支持該類庫,你需要使用下面語句檢查後使用,(不過你最好直接使用方法1,就沒這些事)

use GrafikaImagickEditor; // Import package $editor = new Editor(); // Imagick editor if( $editor->isAvailable() ) { // Safety check      // Your code here  } 

3、GD Editor

你也可以直接使用GD庫,也有些情況可能不支持,記得檢查

use GrafikaGdEditor; // Import package $editor = new Editor(); // Gd editor if( $editor->isAvailable() ) { // Safety check      // Your code here  }  

創建圖像

grafika允許你使用4種方式創建一個待處理的圖像

1、直接打開圖像

創建editor + open方法

use GrafikaGrafika; $editor = Grafika::createEditor(); $editor->open( $image, 'path/to/image.jpg');  

2、使用靜態方法打開圖片

使用直接打開、創建圖片

use GrafikaGrafika; $image = Grafika::createImage('path/to/image.jpg'); // 這裡省略了$editor = Grafika::createEditor();  

3、創建一個空白的畫布

新建一個畫布作為新圖像

use GrafikaGrafika; $image = Grafika::createBlankImage(100,100);  

4、從已有圖片拷貝一個

拷貝一個圖像作為圖像處理

$copy = clone $image; 

這種方法你要保證之前有一張圖片

這幾種方法之後的操作大同小異,我們只選擇第一種常規方法作為講解示例

圖片縮略圖

我們先準備一個原圖 

接下來,假設我們要創建的縮略圖長:200px寬200px

1、Resize Fit

等比例縮放類型。那麼就保證圖片較長的一邊不超過200px,等比縮放,縮放後不填充背景。

use GrafikaGrafika; $editor = Grafika::createEditor(); $editor->open($image1 , 'yanying.jpg'); // 打開yanying.jpg並且存放到$image1 $editor->resizeFit($image1 , 200 , 200); $editor->save($image1 , 'yanying1.jpg');  $editor->open($image2 , 'yanying-h.jpg'); // 打開yanying.jpg並且存放到$image2 $editor->resizeFit($image2 , 200 , 200); $editor->save($image2 , 'yanying2.jpg');  

當然不要忘了第一行的require

2、Resize Exact

固定尺寸縮放類型。就是不管圖片長寬比,全部縮小到200px,可能導致圖片變形。

use GrafikaGrafika; $editor = Grafika::createEditor(); $editor->open($image1 , 'yanying.jpg'); // 打開yanying.jpg並且存放到$image1 $editor->resizeExact($image1 , 200 , 200); $editor->save($image1 , 'yanying1.jpg');  $editor->open($image2 , 'yanying-h.jpg'); // 打開yanying.jpg並且存放到$image2 $editor->resizeExact($image2 , 200 , 200); $editor->save($image2 , 'yanying2.jpg');  

3、Resize Fill

居中剪裁。就是把較短的變縮放到200px,然後將長邊的大於200px的部分居中剪裁掉,圖片不會變形。

4、Resize Exact Width

等寬縮放。和第一種功能相似,最終寬為200px,等比縮放,高度不管。

use GrafikaGrafika; $editor = Grafika::createEditor(); $editor->open($image1 , 'yanying.jpg'); // 打開yanying.jpg並且存放到$image1 $editor->resizeExactWidth($image1 , 200); $editor->save($image1 , 'yanying1.jpg');  $editor->open($image2 , 'yanying-h.jpg'); // 打開yanying.jpg並且存放到$image2 $editor->resizeExactWidth($image2 , 200); $editor->save($image2 , 'yanying2.jpg');  

5、Resize Exact Height

等高縮放。最終高為200px,等比縮放,不考慮圖片寬度。

 

圖像對比功能

1、圖片相似度對比

我們首先準備一張基本圖,用來和其他圖片對比。(segmentfault網頁圖片可能處理過,直接使用本文圖片可能結果不一致)

1)、我們第一次使用一張灰度圖片來比較

use GrafikaGrafika; $editor = Grafika::createEditor(); $result = $editor->compare('yanying.jpg' , 'yanying_grey.jpg'); var_dump($result); // int 2  

說明: grafika圖片對比方法compare返回一個數字,其中如果數字越接近於0,那麼表示圖片越相似。如果數字在0-10範圍內,那麼圖片都可能相似。但是如果數字大於10,那麼,可能就完全不同。

這裡返回2,說明相似度還是非常高的。

2)、我們再用一張縮小的圖片來測試,記住都是和第一張基本圖比較。

use GrafikaGrafika; $editor = Grafika::createEditor(); $result = $editor->compare('yanying.jpg' , 'yanying-smaller.jpg'); var_dump($result); // int 0  

這裡結果返回0,相似度非常高。

3)、我們再用一張剪裁下來的局部圖片測試

use GrafikaGrafika; $editor = Grafika::createEditor(); $result = $editor->compare('yanying.jpg' , 'yanying-half.jpg'); var_dump($result); // int 20  

結果超過10了,相似度不怎麼高

4)、我們再用一張完全不同的圖片測試

 

use GrafikaGrafika; $editor = Grafika::createEditor(); $result = $editor->compare('yanying.jpg' , 'yanying-h.jpg'); var_dump($result); // int 39  

結果39,越來越大,越來越不像

2、比較圖片是否相同

grafika提供方法equal來檢查兩張圖片是否完全相同。這裡的檢查是一個像素一個像素的檢測,所以時間可能會較長。

當然grafika也會預檢查,如果兩張圖片大小不相同,則直接返回false。只有其他都相同後才會進行逐像素檢查。

我們這裡對比之前創建的一張縮略圖,因為大小不一致,所以直接返回false  

 

use GrafikaGrafika; $editor = Grafika::createEditor(); $result = $editor->equal('yanying.jpg' , 'yanying-smaller.jpg'); var_dump($result); // boolean false  

智能剪裁

智能剪裁是自動識別圖像中的重要部分,剪裁時候偏向於保留重點部分。

不過grafika也提供了人為操控位置剪裁,我們先說這個。

基本位置剪裁

基本位置剪裁包含9個位置

top-left top-center top-right center-left center center-right bottom-left bottom-center bottom-right

我們這裡一起說了,這裡我們使用900*600的圖片,分成9塊  

 

use GrafikaGrafika; $editor = Grafika::createEditor();  $src = 'yanying.jpg'; $editor->open( $image, $src ); $editor->crop( $image, 300, 200, 'top-left' ); $editor->save( $image, 'result1.jpg' ); $editor->free( $image );  $editor->open( $image, $src ); $editor->crop( $image, 300, 200, 'top-center' ); $editor->save( $image, 'result2.jpg' ); $editor->free( $image );  $editor->open( $image, $src ); $editor->crop( $image, 300, 200, 'top-right' ); $editor->save( $image, 'result3.jpg' ); $editor->free( $image );  $editor->open( $image, $src ); $editor->crop( $image, 300, 200, 'center-left' ); $editor->save( $image, 'result4.jpg' ); $editor->free( $image );  $editor->open( $image, $src ); $editor->crop( $image, 300, 200, 'center' ); $editor->save( $image, 'result5.jpg' ); $editor->free( $image );  $editor->open( $image, $src ); $editor->crop( $image, 300, 200, 'center-right' ); $editor->save( $image, 'result6.jpg' ); $editor->free( $image );  $editor->open( $image, $src ); $editor->crop( $image, 300, 200, 'bottom-left' ); $editor->save( $image, 'result7.jpg' ); $editor->free( $image );  $editor->open( $image, $src ); $editor->crop( $image, 300, 200, 'bottom-center' ); $editor->save( $image, 'result8.jpg' ); $editor->free( $image );  $editor->open( $image, $src ); $editor->crop( $image, 300, 200, 'bottom-right' ); $editor->save( $image, 'result9.jpg' ); $editor->free( $image );  

看下結果  

智能剪裁

ԭͼ

我們使用智能剪裁將圖片剪裁至200*200px

use GrafikaGrafika; $editor = Grafika::createEditor(); $editor->open( $image, 'yanying-smaller.jpg' ); $editor->crop( $image, 200, 200, 'smart' ); $editor->save( $image, 'yanying-smart.jpg' );  

發現還是可以突出重點的 

GIF縮略圖

壓縮GIF,不丟失動畫

grafika可以直接壓縮GIF圖片,並且不丟失動畫功能。  

 

use GrafikaGrafika; $editor = Grafika::createEditor(); $editor->open( $image, 'sample.gif' ); $editor->resizeFit( $image, 250, 128 ); $editor->save( $image, 'output.gif' );  

我們這裡將原圖壓縮到原來的一半,發現動畫並沒有丟失  

移除GIF動畫效果

當然,如果有需要,我們也可以直接移除GIF的動畫效果

use GrafikaGrafika; $editor = Grafika::createEditor(); $editor->open( $image, 'sample.gif' ); $editor->flatten( $image ); $editor->save( $image, 'output-no-animation.gif' );    

圖片合併

圖片合併需要2張圖片,將其中一張作為基本圖,準備的第二章圖片就是放置在基礎圖片之上。

我們首先來看代碼

use GrafikaGrafika; $editor = Grafika::createEditor(); $editor->open($image1 , 'yanying-h.jpg'); $editor->open($image2 , 'yanying-smaller.jpg'); $editor->blend ( $image1, $image2 , 'normal', 0.9, 'center'); $editor->save($image1,'333/yanying-blend.jpg');  

解釋一下

首先打開兩張圖片,其中$image1為基礎圖片,也就是放在下面的。重點在blend這個方法。

其中

第一個參數為基礎圖片 第二個參數為放置在基礎圖片之上的圖片normal, multiply, overlay or screen.,這裡的類型意思就是圖片疊加的模式,下面會給出實例看每種的不同。 第三個參數為透明度,這個不說太多,容易想到。 第四個為位置,有10個選擇,其中,前面9種為用戶自定義拜訪位置,而最後一個是智能拜訪,由grafika來判斷擺放在哪裡好。top-left, top-center, top-right, center-left, center, center-right, bottom-left, bottom-center, bottom-right and smart 第五個參數為可選參數,表示圖片2距離圖片1左邊的距離 第六個參數也為可選參數,表示圖片2距離圖片1上邊的距離

我們試著擺幾種情況。

1、normal

其中位置信息:center,透明度為0.9,也就是上面代碼的那種  

2、multiply

位置信息:,top-left,其他不變 

3、overlay

位置信息:bottom-right,其他不變  

4、screen

位置信息:,最後一個位置參數不給,也就是默認top-left  

圖像旋轉

圖像旋轉比較簡單,只需要給一個旋轉角度參數就可以了,如果想要給背景填充個顏色,再給一個顏色參數即可。(默認不給背景色為黑色)

代碼如下

use GrafikaGrafika; use GrafikaColor; $editor = Grafika::createEditor(); $editor->open($image , 'yanying-smaller.jpg'); $editor->rotate($image ,'45',new Color('#ff0000')); $editor->save($image,'333/yanying-rotate.jpg');  

最後一個背景顏色參數也是需要Color對象  

圖片寫文字

在圖片上面寫文字的參數比較多,不過如果正常使用,只需要給前兩個必填的即可,後面的參數都是可選的。

我們逐一的來看各個參數

image:所需要寫文字的圖片 text:需要寫的文字 size:(選填)字體大小,默認為12px x:(選填)文字的最左邊距離圖片最左邊的距離,默認為0 y:(選填)文字的基線到圖片的最上邊的距離,默認是12px,也就是文字的高度。(基線你就當做文字最下面好了) color:(選填)字體顏色,Color對象,需要new Color一下,默認為黑色。 font:(選填)字體的完整路徑,默認Sans font. angle:(選填)文字旋轉角度,取值範圍為0-359,默認為0,也就是不旋轉

我們隨便找個文字試試

use GrafikaGrafika; use GrafikaColor; $editor = Grafika::createEditor(); $editor->open($image , 'yanying-smaller.jpg'); $editor->text($image ,'yanying',30,200,100,new olor("#000000"),'',45); $editor->save($image,'333/yanying-text.jpg');  

看下效果。這裡說明下,如果文字為中文,需要找一個支持中文的字體。默認字體不支持中文,所以你寫中文,就是都是小方框。

點讚 0

相關焦點

  • PHP實例——PHP創建動態圖像
    只要安裝一些第三方的庫文件並具有一定的幾何知識,就可以利用PHP來創建和處理圖像了。利用PHP創建動態圖像是相當容易的一件事情。下面,筆者將詳細介紹如何實現。     在使用基本的圖像創建函數之前,需要安裝GD庫文件。如果要使用與JPEG有關的圖像創建函數,還需要安裝jpeg-6b,如果要在圖像中使用Type 1型字體,則必須安裝t1lib。      在建立圖像創建環境之前,還需要做一些準備工作。
  • 常用的十大 python 圖像處理工具
    但無論是用於何種用途,這些圖像都需要進行處理。圖像處理就是分析和處理數字圖像的過程,主要旨在提高其質量或從中提取一些信息,然後可以將其用於某種用途。圖像處理中的常見任務包括顯示圖像,基本操作如裁剪、翻轉、旋轉等,圖像分割,分類和特徵提取,圖像恢復和圖像識別。
  • 計算機視覺19:使用Python機器學習庫Keras進行圖像處理(下)
    當你在訓練CNN圖像分類模型的過程很慢時,當你想要取得更加優越的模型分類性能時,那麼需要學會對圖像訓練數據做預處理。本文將會介紹使用機器學習庫Keras對圖像進行常規的幾種處理,並利用處理後的圖像訓練卷積神經網絡。
  • 基於opencv 的圖像處理入門教程
    前言雖然計算機視覺領域目前基本是以深度學習算法為主,但實際上很多時候對圖片的很多處理方法,並不需要採用深度學習的網絡模型,採用目前成熟的圖像處理庫即可實現,比如 OpenCV 和 PIL ,對圖片進行簡單的調整大小、裁剪、旋轉,或者是對圖片的模糊操作。
  • PIL (Python圖像處理庫) 1.1.7 發布
    PIL 1.1.7 發布了,該版本改進了對 PNG 壓縮的處理,支持隔行掃描的PNG文件,改進了對各種 TGA 的支持,修復了一些錯誤等等
  • DVBBS ASP7.1 AC到PHP1.0升級教程
    1、要先說明,你的空間要支持PHP和MYSQL。2、下載轉換程序3、下載原程序4、把下載的原程序壓縮包解壓上傳到空間目錄,如我的:PHP目錄下。5、傳完安裝,運行:install/install.php。
  • 使用Python+OpenCV進行圖像處理(二)
    本篇是視覺入門系列教程的第二篇。整個視覺入門系列內容如下:理解顏色模型與在圖像上繪製圖形(圖像處理基本操作)。基本的圖像處理與濾波技術。從特徵檢測到人臉檢測。對應的圖像處理技術包括:模糊化(Blurring)、閾值化(thresholding)和形態轉換(morphological transformation)。本篇我們將詳細介紹這幾個常見的圖像預處理技術。(本文假設讀者已經熟悉卷積的概念。)模糊化(Blurring)模糊化的目標是實現降噪。
  • python圖像處理-gif動圖
    圖片合成動圖導入os庫,利用listdir方法將lion文件夾中的圖片全部讀取出來,循環打開每一張圖片,接著將圖片對象添加到frames列表中,最後利用save方法,保存為一張動圖。比如你所以把一些尺寸不同的圖片合成動圖時,需要先將所有圖片統一尺寸,需要使用resize方法;或者你想在動圖上加上文字,可以結合之前處理單張圖片添加文字的方法,處理完之後在統一合成;或者你還想調整動圖的速率等等,具體更多內容可以留言問我。
  • 教程:使用Python進行基本圖像數據分析!
    [來自IT168]  【IT168 評論】本教程將介紹如何導入圖像並觀察其屬性、拆分圖層以及查看灰度。在正式開始之前,我們先來了解一些關於像素的基礎知識。  計算機將圖片以像素形式存儲,這就像馬賽克一樣。如果像素太大,很難製作光滑的邊緣和曲線。相反,我們使用的像素越多越小,看起來就會越平滑,或者說像素化程度越小,圖像就會越好看,有時,這也被稱為圖像解析度。
  • 使用Python OpenCV處理圖像之詳解直線、圓、矩形及文字的繪製
    我們知道,OpenCV作為一款強大的圖像處理庫,它能對圖像進行一些類似PS上面的處理,如果你足夠精通它,你可能會發掘比PS處理圖像更加豐富的功能……但是,作為Python新手,你不可能跳過一些基礎內容的學習過程。
  • 圖像處理技術是什麼_圖像處理技術現狀和發展前景
    對圖像進行處理(或加工、分析)的主要目的有三個方面:   (1)提高圖像的視感質量,如進行圖像的亮度、彩色變換,不管是何種目的的圖像處理,都需要由計算機和圖像專用設備組成的圖像處理系統對圖像數據進行輸入、加工和輸出。 數字圖像處理過程   1、 圖像的數位化 通過取樣和量化將一個以自然形態存在的圖像變換為適於計算機處理的數字形式。用矩陣的形式來表示圖像的各種信息。   2、圖像的的目的是在不改變圖像的質量基礎上壓縮圖像的信息量,以滿足傳輸與存儲的要求。
  • 驗證碼識別實例,python簡單圖像處理和實現
    基本識別原理概述:1、每一幅圖像在構成上,都是由一個個像素組成的矩陣,每一個像素為單元格。2、 彩色圖像的像素的由三原色(紅,綠,藍)構成元組,灰度圖像的像素是一個單值,每個像素的值範圍為(0,255)。
  • 論文圖片處理,哪些能做?哪些算造假?
    在處理圖片的時候,自己心裡念叨一下,應該能讓很多人懸崖勒馬或者辯證處理;尤其是一些造假者事後委屈地說,哎呀,我只是不懂怎麼規範處理圖像,更應該多念念。在科研圖片處理四項基本原則不斷發展和成熟的過程裡,也有專門針對科研圖片處理不端的論文發表,以圖文並茂的方式來說明什麼是圖片處理不端。
  • Python圖像處理之圖片文字識別(OCR)
    可以實現OCR 的底層庫並不多,目前很多庫都是使用共同的幾個底層OCR 庫,或者是在上面進行定製。  Tesseract 是一個OCR 庫,目前由Google 贊助(Google 也是一家以OCR 和機器學習技術聞名於世的公司)。Tesseract 是目前公認最優秀、最精確的開源OCR 系統。  除了極高的精確度,Tesseract 也具有很高的靈活性。
  • Xilinx與Silicon開啟硬體圖像處理機器視覺應用大門
    然而,圖像處理應用領域硬體程式設計師的稀缺阻礙了FPGA技術應用。 」她說:「VisualApplets為Zynq-7000 All Programmable SoC這樣基於硬體的圖像處理應用技術打開了大門。」
  • ImagePy——UI界面支持開放插件的Python開源圖像處理框架
    在 github:https://github.com/Image-Py/imagepy 上,不僅有關於這款圖像處理軟體的詳細介紹,還有一些使用示例,雷鋒網 AI 科技評論接下來將詳細介紹這一開源圖像處理框架。
  • PHP實現簡單線性回歸之數學庫的重要性
    為詳細的API制定首選項。盡善盡美並非目標。讓我們更詳細地逐條研究這些指導方針。 每個分析模型建立一個類每種主要的分析測試或過程應當有一個名稱與測試或過程名相同的PHP類,這個類包含了輸入函數、計算中間值和匯總值的函數和輸出函數(將中間值和匯總值用文本或圖形格式全部顯示在屏幕上)。
  • 如何學好圖像處理——從小白到大神?
    縱向來說,數字圖像處理研究的歷史相當悠久;橫向來說,數字圖像處理研究的話題相當廣泛。  數字圖像處理的歷史可以追溯到近百年以前,大約在1920年的時候,圖像首次通過海底電纜從英國倫敦傳送到美國紐約。圖像處理的首次應用是為了改善倫敦和紐約之間海底電纜發送的圖片質量,那時就應用了圖像編碼,被編碼後的圖像通過海底電纜傳送至目的地,再通過特殊設備進行輸出。
  • Metal圖像處理——直方圖均衡化
    因未能核實來源或轉發內容圖片有權利瑕疵的,請及時聯繫本號,本號會第一時間進行修改或刪除。首先,我們用直方圖來表示一張圖像:橫坐標代表的是顏色值,縱坐標代表的是該顏色值在圖像中出現次數。>同前文,不再贅述,詳見Metal入門教程總結。
  • 教程:拍攝和處理獵戶座星座
    這是一個教程,將教你如何拍攝和處理夜空中最豐富多彩的部分之一,獵戶座星座。它將引導您完成規劃,拍攝和處理獵戶座照片以及其中豐富多彩的功能的所有步驟。介紹一年中拍攝最亮部分天空的最佳時間通常是在六月或七月,當時銀河系中心在整個夜晚都顯得很高。