摘要:個(gè)人博客本文原地址最近的項(xiàng)目中,需要用到畫(huà)圖和圖片拼接效果,這里是一些開(kāi)發(fā)過(guò)程里用到的一些點(diǎn)還有就是一些踩過(guò)的坑。通過(guò)生成圖片格式,為前端所使用。需要注意的是前端得到的額數(shù)據(jù)里包含有回車字符,需要特殊處理才可以正確顯示圖片。
個(gè)人博客 https://duanruilong.github.io/blog/本文原地址https://duanruilong.github.io/blog/2018/09/05/%E5%9C%A8PHP%E9%87%8C%E5%BE%88%E5%A5%BD%E7%9A%84%E4%BD%BF%E7%94%A8ImageMagick/
最近的PHP項(xiàng)目中,需要用到畫(huà)圖和圖片拼接效果,這里是一些開(kāi)發(fā)過(guò)程里用到的一些點(diǎn)還有就是一些踩過(guò)的坑。通過(guò)ImageMagick生成base64圖片格式,為前端所使用。
一些需要的知識(shí)點(diǎn)PHP將圖片轉(zhuǎn)base64編碼以及base64圖片轉(zhuǎn)換為圖片并保存代碼 圖片轉(zhuǎn)base64編碼
/*圖片轉(zhuǎn)換為 base64格式編碼*/ $img = "uploads/about.png"; $base64_img = base64EncodeImage($img); echo ""; 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圖片轉(zhuǎn)換為圖片并保存
/* base64格式編碼轉(zhuǎn)換為圖片并保存對(duì)應(yīng)文件夾 */ 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)){ //檢查是否有該文件夾,如果沒(méi)有就創(chuàng)建,并給予最高權(quán)限 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個(gè)字符來(lái)表示任意二進(jìn)制數(shù)據(jù)的方法。
Base64的原理很簡(jiǎn)單,首先,準(zhǔn)備一個(gè)包含64個(gè)字符的數(shù)組:
["A", "B", "C", ... "a", "b", "c", ... "0", "1", ... "+", "/"]
然后,對(duì)二進(jìn)制數(shù)據(jù)進(jìn)行處理,每3個(gè)字節(jié)一組,一共是3x8=24bit,劃為4組,每組正好6個(gè)bit
如果要編碼的二進(jìn)制數(shù)據(jù)不是3的倍數(shù),最后會(huì)剩下1個(gè)或2個(gè)字節(jié)怎么辦?Base64用x00字節(jié)在末尾補(bǔ)足后,再在編碼的末尾加上1個(gè)或2個(gè)=號(hào),表示補(bǔ)了多少字節(jié),解碼的時(shí)候,會(huì)自動(dòng)去掉。
使用jpg圖片體積要比png小
使用PHP的Imagick類進(jìn)行圖像的操作
// 初始化一個(gè)畫(huà)板 $img =new Imagick(); $img->newImage(750,1046,"white","jpg") ;(2).在底圖上添加需求圖片
前提是我們已經(jīng)知道了需要合并的圖片鏈接地址
$item_img="https://img.alicdn.com/bao/uploaded/i1/1750208593/TB1rgM3hhtnkeRjSZSgXXXAuXXa_!!0-item_pic.jpg" 第一步:實(shí)例化圖片 $imgtwo = new Imagick($item_img); 第二步:設(shè)置添加圖片的大小 $imgtwo->resizeImage(750,764,Imagick::FILTER_LANCZOS,1); 關(guān)于resizeImage參數(shù)說(shuō)明 bool Imagick::resizeImage ( int $columns , int $rows , int $filter , float $blur [, bool $bestfit = false ] ) 參數(shù): ● columns 圖片的寬度 ● rows 圖片高度 ● filter 過(guò)濾器,用于過(guò)濾圖片,有高斯filte根據(jù)情況而定 ● 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 ] ) 參數(shù): ● composite_object :用于合并的圖片的Imagick對(duì)象 ● composite:合并操作,定義操作常量。 具體請(qǐng)查看 合并操作常量列表 ● x:相對(duì)圖像頂點(diǎn)左上位置(0,0)的橫坐標(biāo) ● y:相對(duì)圖像頂點(diǎn)左上位置(0,0)的縱坐標(biāo) ● channel:通過(guò)傳入一個(gè)通道常量,來(lái)開(kāi)啟通道模式。為了支持多個(gè)通道,可以通過(guò)二進(jìn)制運(yùn)算的操作來(lái)合并多個(gè)通道常量。 到這里就可以得到一個(gè)合并的圖片了 1、加一個(gè)header信息,可以直接在網(wǎng)頁(yè)上查看圖片 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; //要生成的圖片的路徑,隨機(jī)生成圖片名稱(3).圖片上拼接文字
寫(xiě)入文字以添加店鋪文字為例,逐步完成文字的寫(xiě)入。
$shop_title="測(cè)試店鋪"; // 添加店鋪文字 $drawQr = new ImagickDraw(); // 實(shí)例化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); // 畫(huà)出文字 $img -> drawImage($drawQr); // 畫(huà)在地板上
詳細(xì)解讀:
1、實(shí)例化ImagickDraw類:
$drawQr = new ImagickDraw();
2、設(shè)置字體顏色
$drawQr -> setFillColor(new ImagickPixel("#999999"));
3、設(shè)置字體大小
$drawQr -> setFontSize("24");
4、設(shè)置字體格式
$drawQr -> setFont("../../conf/Microsoftyahei.ttf");
5、設(shè)置字體方向
$draw->setTextAlignment(Imagick::ALIGN_RIGHT);
ps: Imagick::ALIGN_RIGHT 朝右邊 Imagick::ALIGN_LEFT 左邊 Imagick::ALIGN_CENTER 中間
6、設(shè)置字體編碼
$drawQr -> setTextEncoding("utf-8");
7、畫(huà)出文字
$drawQr -> annotation(114,990,$shop_title);
8、在底圖上寫(xiě)入字體
$img -> drawImage($drawQr);
寫(xiě)入文字這個(gè)地方的一些坑:
沒(méi)有設(shè)置字體格式時(shí),中文字會(huì)解析錯(cuò)誤
(英文沒(méi)有問(wèn)題)
(漢字解析失敗)
(設(shè)置字體格式正常顯示)
(4).圖片base64導(dǎo)出最終得到的圖片我們組要以base64的格式傳遞給前端,進(jìn)行以下操作,把我們最后拼接的到的圖片base64轉(zhuǎn)換輸出。
$dest_img="/data/tmp/" . md5(microtime(true)).".".$type; //要生成的圖片的路徑 $Return = array(); // *圖片轉(zhuǎn)換為 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數(shù)據(jù)里包含有" "回車字符,需要特殊處理才可以正確顯示圖片。
(最后得到的合并圖片)
(調(diào)整拼接圖片大小得到不同的圖片)
最后來(lái)一組單打詹!!!
覺(jué)得喜歡歡迎關(guān)注,start
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/97744.html
摘要:個(gè)人博客本文原地址最近的項(xiàng)目中,需要用到畫(huà)圖和圖片拼接效果,這里是一些開(kāi)發(fā)過(guò)程里用到的一些點(diǎn)還有就是一些踩過(guò)的坑。通過(guò)生成圖片格式,為前端所使用。需要注意的是前端得到的額數(shù)據(jù)里包含有回車字符,需要特殊處理才可以正確顯示圖片。 個(gè)人博客 https://duanruilong.github.io/blog/本文原地址https://duanruilong.github.io/blog/2...
摘要:指定字體和顏色創(chuàng)建一個(gè)底圖創(chuàng)建一個(gè)白色的底圖,我們可以在上面繪制文字創(chuàng)建一個(gè)底圖并且加上一些文字要生成的圖片的路徑可以在服務(wù)器端看到這里需要注意一下文字的繪制命令順序,否則會(huì)出現(xiàn)沒(méi)有生效的問(wèn)題。 [原文鏈接]https://duanruilong.github.io...://duanruilong.github.io/blog/2018/09/18/%E5%9C%A8PHP%E9%8...
摘要:指定字體和顏色創(chuàng)建一個(gè)底圖創(chuàng)建一個(gè)白色的底圖,我們可以在上面繪制文字創(chuàng)建一個(gè)底圖并且加上一些文字要生成的圖片的路徑可以在服務(wù)器端看到這里需要注意一下文字的繪制命令順序,否則會(huì)出現(xiàn)沒(méi)有生效的問(wèn)題。 [原文鏈接]https://duanruilong.github.io...://duanruilong.github.io/blog/2018/09/18/%E5%9C%A8PHP%E9%8...
摘要:安裝環(huán)境說(shuō)明操作系統(tǒng)安裝路徑開(kāi)始編譯開(kāi)始編譯配置支持?jǐn)U展修改以下內(nèi)容增加擴(kuò)展到重新啟動(dòng)開(kāi)始編譯配置支持?jǐn)U展修改以下內(nèi)容增加擴(kuò)展到重新啟動(dòng)測(cè)試勞動(dòng)結(jié)果查看模塊是 安裝環(huán)境說(shuō)明: 操作系統(tǒng):Centos 6.5 -64bit 安裝路徑:/usr/local/redis 開(kāi)始編譯 ImageMagick tar -zxvf ImageMagick-6.8.9-10.tar.gz cd Ima...
閱讀 1239·2021-11-23 09:51
閱讀 685·2021-11-19 09:40
閱讀 1350·2021-10-11 10:58
閱讀 2358·2021-09-30 09:47
閱讀 3735·2021-09-22 15:55
閱讀 2168·2021-09-03 10:49
閱讀 1262·2021-09-03 10:33
閱讀 704·2019-08-29 17:12