最近的PHP項目中,需要用到畫圖和圖片拼接效果。通過ImageMagick生成base64圖片格式,為前端所使用。PHP將圖片轉base64編碼以及base64圖片轉換為圖片並保存代碼:
base64圖片轉換為圖片並保存
Base64是一種用64個字符來表示任意二進位數據的方法。Base64的原理很簡單,首先,準備一個包含64個字符的數組:['A', 'B', 'C', ... 'a', 'b', 'c', ... '0', '1', ... '+', '/']然後,對二進位數據進行處理,每3個字節一組,一共是3x8=24bit,劃為4組,每組正好6個bit如果要編碼的二進位數據不是3的倍數,最後會剩下1個或2個字節怎麼辦?Base64用x00位元組在末尾補足後,再在編碼的末尾加上1個或2個=號,表示補了多少字節,解碼的時候,會自動去掉。使用jpg圖片體積要比png小,使用PHP的Imagick類進行圖像的操作。Imagick具體操作:(1).創建一個底圖,寬750px,高1046px,白色背景,格式為jpg的圖片// 初始化一個畫板 $img =new Imagick(); $img->newImage(750,1046,'white','jpg');(2).在底圖上添加需求圖片,前提是我們已經知道了需要合併的圖片連結地址
$item_img='https://localhost/bao/uploaded/i1/1750208593/TB1rgM3hhtnkeRjSZSgXXXAuXXa_!!0-item_pic.jpg'第一步:實例化圖片$imgtwo = new Imagick($item_img);第二步:設置添加圖片的大小$imgtwo->resizeImage(750,764,Imagick::FILTER_LANCZOS,1);關於resizeImage參數說明bool Imagick::resizeImage ( int $columns , int $rows , int $filter , float $blur [, bool $bestfit = false ] )參數:● columns 圖片的寬度● rows 圖片高度● filter 過濾器,用於過濾圖片,有高斯filte根據情況而定● blur blur=1 為虛化, blur =-1 為銳化第三步:與底圖合併$img->compositeImage($imgtwo,$imgtwo->getImageCompose(),0,0);使用compositeImage();bool Imagick::compositeImage ( Imagick $composite_object , int $composite , int $x , int $y [, int $channel = Imagick::CHANNEL_ALL ] )參數:● composite_object :用於合併的圖片的Imagick對象● composite:合併操作,定義操作常量。 具體請查看 合併操作常量列表● x:相對圖像頂點左上位置(0,0)的橫坐標● y:相對圖像頂點左上位置(0,0)的縱坐標● channel:通過傳入一個通道常量,來開啟通道模式。為了支持多個通道,可以通過二進位運算的操作來合併多個通道常量。到這裡就可以得到一個合併的圖片了1、加一個header信息,可以直接在網頁上查看圖片header("Content-Type: img/png");echo $img;2、可以把圖片在指定目錄中生成,在指定目錄下生成為img.png$file="./img.png";$img->writeImage($file);我這裡是這樣處理:header ( 'Content-type: ' . strtolower ($img->getImageFormat ()) );$type = strtolower($img->getImageFormat());$dest_img='/data/tmp/' . md5(microtime(true)).'.'.$type; //要生成的圖片的路徑,隨機生成圖片名稱
(3).圖片上拼接文字。寫入文字以添加店鋪文字為例,逐步完成文字的寫入。
詳細解讀:1、實例化ImagickDraw類: $drawQr = new ImagickDraw(); 2、設置字體顏色$drawQr -> setFillColor(new ImagickPixel('#999999')); 3、設置字體大小$drawQr -> setFontSize('24'); 4、設置字體格式$drawQr -> setFont('../../conf/Microsoftyahei.ttf'); 5、設置字體方向$draw->setTextAlignment(Imagick::ALIGN_RIGHT); ps: Imagick::ALIGN_RIGHT 朝右邊 Imagick::ALIGN_LEFT 左邊 Imagick::ALIGN_CENTER 中間 6、設置字體編碼$drawQr -> setTextEncoding("utf-8"); 7、畫出文字$drawQr -> annotation(114,990,$shop_title); 8、在底圖上寫入字體$img -> drawImage($drawQr);
(4).圖片base64導出。最終得到的圖片我們組要以base64的格式傳遞給前端,進行以下操作,把我們最後拼接的到的圖片base64轉換輸出。
$base64_image就是base64格式的圖片。