在PHP里使用 ImageMagick 生成 base64 图片
個人博客 duanruilong.github.io/blog/
本文原地址duanruilong.github.io/blog/2018/0…
最近的PHP項目中,需要用到畫圖和圖片拼接效果,這里是一些開發過程里用到的一些點還有就是一些踩過的坑。通過ImageMagick生成base64圖片格式,為前端所使用。
一些需要的知識點
PHP將圖片轉base64編碼以及base64圖片轉換為圖片并保存代碼
圖片轉base64編碼
/*圖片轉換為 base64格式編碼*/ $img = 'uploads/about.png'; $base64_img = base64EncodeImage($img); echo '<img src="' . $base64_img . '" />';function base64EncodeImage ($image_file) {$base64_image = '';$image_info = getimagesize($image_file);$image_data = fread(fopen($image_file, 'r'), filesize($image_file));$base64_image = 'data:' . $image_info['mime'] . ';base64,' . chunk_split(base64_encode($image_data));return $base64_image; } 復制代碼base64圖片轉換為圖片并保存
/* base64格式編碼轉換為圖片并保存對應文件夾 */ function base64_image_content($base64_image_content,$path){//匹配出圖片的格式if (preg_match('/^(data:\s*image\/(\w+);base64,)/', $base64_image_content, $result)){$type = $result[2];$new_file = $path."/".date('Ymd',time())."/";if(!file_exists($new_file)){//檢查是否有該文件夾,如果沒有就創建,并給予最高權限mkdir($new_file, 0700);}$new_file = $new_file.time().".{$type}";if (file_put_contents($new_file, base64_decode(str_replace($result[1], '', $base64_image_content)))){return '/'.$new_file;}else{return false;}}else{return false;} }echo base64_image_content($base64_img,"uploads/"); 復制代碼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://img.alicdn.com/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).圖片上拼接文字
寫入文字以添加店鋪文字為例,逐步完成文字的寫入。
$shop_title='測試店鋪';// 添加店鋪文字$drawQr = new ImagickDraw(); // 實例化ImagickDraw$drawQr -> setFillColor(new ImagickPixel('#999999')); // 顏色$drawQr -> setFontSize('24'); // 大小$drawQr -> setFont('../../conf/Microsoftyahei.ttf'); // 字體$drawQr -> setTextAlignment(Imagick::ALIGN_LEFT); // 字體方向// ps: Imagick::ALIGN_RIGHT 朝右邊 Imagick::ALIGN_LEFT 左邊 Imagick::ALIGN_CENTER 中間$drawQr -> setTextEncoding("utf-8"); // 字體編碼$drawQr -> annotation(114,990,$shop_title); // 畫出文字$img -> drawImage($drawQr); // 畫在地板上 復制代碼詳細解讀:
- 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轉換輸出。
$dest_img='/data/tmp/' . md5(microtime(true)).'.'.$type; //要生成的圖片的路徑$Return = array();// *圖片轉換為 base64格式編碼*$base64_image = '';$image_info = getimagesize($dest_img);$image_data = fread(fopen($dest_img, 'r'), filesize($dest_img));$base64_image = 'data:' . $image_info['mime'] . ';base64,' . chunk_split(base64_encode($image_data));$Return['data']=$base64_image;return $Return; 復制代碼$base64_image就是base64格式的圖片。
需要注意的是前端得到的額base64數據里包含有'\r\n'回車字符,需要特殊處理才可以正確顯示圖片。
(最后得到的合并圖片)
(調整拼接圖片大小得到不同的圖片)
最后來一組單打詹!!!
覺得喜歡歡迎關注,start
轉載于:https://juejin.im/post/5b994ffde51d450e9a2dfc8d
總結
以上是生活随笔為你收集整理的在PHP里使用 ImageMagick 生成 base64 图片的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 汇编中的数组分配和指针
- 下一篇: MongoDB 主从复制集搭建