PHP實(shí)現(xiàn)首字母(截取第一個(gè)漢字)生成頭像圖片
會(huì)員系統(tǒng)中,用戶(hù)如果不上傳自定義頭像,使用固定圖片作為頭像未免有些單調(diào)。PHP可以實(shí)現(xiàn)生成用戶(hù)名首字母或者第一個(gè)漢字(第一個(gè)字符)的頭像圖片,不使用第三方API,第三方雖然圖片比較多,但是會(huì)有超時(shí)。
設(shè)計(jì)思路
定義了一個(gè)letter_avatar函數(shù),接收一個(gè)參數(shù)$text,表示要生成頭像的文字。
使用hash函數(shù)計(jì)算出$text的哈希值,并將其解包為一個(gè)無(wú)符號(hào)長(zhǎng)整型數(shù)。
將哈希值對(duì)360取余得到一個(gè)色相值$hue。
使用hsv2rgb函數(shù)將色相、飽和度和亮度轉(zhuǎn)換為RGB分量值。
根據(jù)RGB值生成背景顏色$bg。
設(shè)定文字顏色$color為白色。
使用mb_strtoupper函數(shù)將$text的首字母轉(zhuǎn)為大寫(xiě)。
使用SVG語(yǔ)法生成一個(gè)正方形的背景和一個(gè)居中的文字。
使用base64_encode函數(shù)將SVG代碼轉(zhuǎn)為Base64編碼。
將Base64編碼和前綴data:image/svg+xml;base64,拼接成完整的圖片路徑。
返回生成的圖片路徑。 注意:這段代碼只是生成了一個(gè)頭像圖片的路徑,并沒(méi)有將圖片輸出到頁(yè)面中。如果要在頁(yè)面中顯示頭像,需要將生成的圖片路徑作為<img>標(biāo)簽的src屬性值。
完整代碼
//1、方法調(diào)用測(cè)試 letter_avatar("hello") //2、生成圖片方法 function letter_avatar($text) { $total = unpack('L', hash('adler32', $text, true))[1]; $hue = $total % 360; list($r, $g, $b) = hsv2rgb($hue / 247, 0.3, 0.9); $bg = "rgb(247,186,11)"; $color = "#ffffff"; $first = mb_strtoupper(mb_substr($text, 0, 1)); $src = base64_encode('<svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="100" width="100"><rect fill="' . $bg . '" x="0" y="0" width="100" height="100"></rect><text x="50" y="50" font-size="50" text-copy="fast" fill="' . $color . '" text-anchor="middle" text-rights="admin" dominant-baseline="central">' . $first . '</text></svg>'); // 確保圖片保存的路徑存在 $tempPath = WEB_PATH . 'temp' . DS . 'avatar' . DS; $filename = md5('avatar_' . uniqid()); // 生成圖片鏈接 return base64_to_image_url('data:image/svg+xml;base64,' . $src, $tempPath, $filename); } </details> //3、生成https訪(fǎng)問(wèn)鏈接 function base64_to_image_url($base64_string, $output_folder, $image_name) { $data = substr($base64_string, strpos($base64_string, ',') + 1); // 對(duì)數(shù)據(jù)進(jìn)行Base64解碼 $fileData = base64_decode($data); // 創(chuàng)建輸出目錄如果它不存在 if (!file_exists($output_folder)) { mkdir($output_folder, 0755, true); } // 將解碼后的數(shù)據(jù)保存到文件 $file = $output_folder . $image_name . '.svg'; if (file_put_contents($file, $fileData)) { // 返回圖片的URL return base_url() . 'temp' . DS . 'avatar' . DS . $image_name. '.svg'; } return false; } //4、RGB function hsv2rgb($h, $s, $v) { $r = $g = $b = 0; $i = floor($h * 6); $f = $h * 6 - $i; $p = $v * (1 - $s); $q = $v * (1 - $f * $s); $t = $v * (1 - (1 - $f) * $s); switch ($i % 6) { case 0: $r = $v; $g = $t; $b = $p; break; case 1: $r = $q; $g = $v; $b = $p; break; case 2: $r = $p; $g = $v; $b = $t; break; case 3: $r = $p; $g = $q; $b = $v; break; case 4: $r = $t; $g = $p; $b = $v; break; case 5: $r = $v; $g = $p; $b = $q; break; } return [ floor($r * 255), floor($g * 255), floor($b * 255) ]; }
總結(jié)
到此這篇關(guān)于PHP實(shí)現(xiàn)首字母(截取第一個(gè)漢字)生成頭像圖片的文章就介紹到這了,更多相關(guān)PHP字母或漢字生成頭像內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
PHP導(dǎo)出數(shù)據(jù)超時(shí)的優(yōu)化建議
當(dāng)數(shù)據(jù)訪(fǎng)問(wèn)次數(shù)過(guò)多時(shí),建議使用redis緩存一些固定數(shù)據(jù),減少mysql查詢(xún)次數(shù)。今天小編給大家分享PHP導(dǎo)出數(shù)據(jù)超時(shí)的優(yōu)化建議,感興趣的朋友一起看看吧2021-07-07Laravel框架學(xué)習(xí)筆記(一)環(huán)境搭建
本文主要是把自己學(xué)習(xí)Laravel框架中的經(jīng)驗(yàn)寫(xiě)下來(lái)。這是本系列的第一篇,工欲善其事必先利其器,先把環(huán)境搭建好吧,之前也沒(méi)寫(xiě)過(guò)什么文章,可能文章結(jié)構(gòu)比較混亂,想到那寫(xiě)到哪。2014-10-10PHP接口類(lèi)(interface)的定義、特點(diǎn)和應(yīng)用示例
這篇文章主要介紹了PHP接口類(lèi)(interface),結(jié)合實(shí)例形式分析了PHP接口類(lèi)(interface)的基本功能、定義、特點(diǎn)、用法與相關(guān)注意事項(xiàng),需要的朋友可以參考下2020-05-05PHP用Session實(shí)現(xiàn)用戶(hù)登陸功能
Session 是存儲(chǔ)在服務(wù)器端的會(huì)話(huà),相對(duì)安全,并且不像 Cookie 那樣有存儲(chǔ)長(zhǎng)度限制。由于 Session 是以文本文件形式存儲(chǔ)在服務(wù)器端的,所以不怕遠(yuǎn)程用戶(hù)修改 Session 內(nèi)容。這篇文章主要介紹了PHP用Session實(shí)現(xiàn)用戶(hù)登陸功能,需要的朋友可以參考下2022-12-12基于HTTP長(zhǎng)連接的"服務(wù)器推"技術(shù)的php 簡(jiǎn)易聊天室
關(guān)于HTTP長(zhǎng)連接的“服務(wù)器推”技術(shù)原理可以查看IBM的這篇文章,我簡(jiǎn)單的做了個(gè)DEMO.2009-10-10