www.gusucode.com > Carbon Forum PHP轻论坛系统 v3.6.5源码程序 > Carbon-Forum-3.6.5/includes/MaterialDesign.Avatars.class.php
<?php /* * Material-Design-Avatars * https://github.com/lincanbin/Material-Design-Avatars * * Copyright 2015 Canbin Lin (lincanbin@hotmail.com) * http://www.94cb.com/ * * Licensed under the Apache License, Version 2.0: * http://www.apache.org/licenses/LICENSE-2.0 * * Create material deisgn avatars for users just like Gmail or Messager in Android. */ class MDAvtars { public $Char; public $AvatarSize; public $Padding; public $Avatar; public $FontFile; public $IsNotletter; public $LetterFont; public $AsianFont; public $EnableAsianChar; function __construct($Char, $AvatarSize = 256) { $this->Char = strtoupper(mb_substr($Char, 0, 1, "UTF-8")); $this->AvatarSize = $AvatarSize; $this->Padding = 30*($this->AvatarSize/256); $this->LetterFont = __DIR__.'/fonts/SourceCodePro-Light.ttf'; $this->AsianFont = __DIR__.'/fonts/SourceHanSansCN-Normal.ttf'; $this->EnableAsianChar = is_file($this->AsianFont); $CNChar=ord($this->Char); if (!$this->EnableAsianChar && preg_match("/^[\x7f-\xff]/", $this->Char) && !($CNChar>=ord("A") && $CNChar<=ord("z")) ){ //如果是中文,并且没有中文字体包,则按拼音首字母对其进行转换 $CNByte = iconv("UTF-8","gb2312", $this->Char); $Code=ord($CNByte{0}) * 256 + ord($CNByte{1}) - 65536;//求其偏移量 if($Code>=-20319 and $Code<=-20284) $this->Char = "A"; if($Code>=-20283 and $Code<=-19776) $this->Char = "B"; if($Code>=-19775 and $Code<=-19219) $this->Char = "C"; if($Code>=-19218 and $Code<=-18711) $this->Char = "D"; if($Code>=-18710 and $Code<=-18527) $this->Char = "E"; if($Code>=-18526 and $Code<=-18240) $this->Char = "F"; if($Code>=-18239 and $Code<=-17923) $this->Char = "G"; if($Code>=-17922 and $Code<=-17418) $this->Char = "H"; if($Code>=-17417 and $Code<=-16475) $this->Char = "J"; if($Code>=-16474 and $Code<=-16213) $this->Char = "K"; if($Code>=-16212 and $Code<=-15641) $this->Char = "L"; if($Code>=-15640 and $Code<=-15166) $this->Char = "M"; if($Code>=-15165 and $Code<=-14923) $this->Char = "N"; if($Code>=-14922 and $Code<=-14915) $this->Char = "O"; if($Code>=-14914 and $Code<=-14631) $this->Char = "P"; if($Code>=-14630 and $Code<=-14150) $this->Char = "Q"; if($Code>=-14149 and $Code<=-14091) $this->Char = "R"; if($Code>=-14090 and $Code<=-13319) $this->Char = "S"; if($Code>=-13318 and $Code<=-12839) $this->Char = "T"; if($Code>=-12838 and $Code<=-12557) $this->Char = "W"; if($Code>=-12556 and $Code<=-11848) $this->Char = "X"; if($Code>=-11847 and $Code<=-11056) $this->Char = "Y"; if($Code>=-11055 and $Code<=-10247) $this->Char = "Z"; } if(in_array($this->Char, str_split('QWERTYUIOPASDFGHJKLZXCVBNM0123456789', 1))){ $this->IsNotletter = false; $this->FontFile = $this->LetterFont; }else{ $this->IsNotletter = true; $this->FontFile = $this->AsianFont; } $this->Initialize(); } private function Initialize() { //extension_loaded('gd') $Width = $this->AvatarSize;//Width of avatar $Height = $this->AvatarSize;//Height of avatar $Padding = $this->Padding; $this->Avatar = imagecreatetruecolor($Width, $Height); //全透明背景 imageSaveAlpha($this->Avatar, true); $BackgroundAlpha = imagecolorallocatealpha($this->Avatar, 255, 255, 255, 127); imagefill($this->Avatar, 0, 0, $BackgroundAlpha); //抗锯齿 if(function_exists('imageantialias')){ imageantialias($this->Avatar, true); } //Material Design参考颜色 //http://www.google.com/design/spec/style/color.html#color-color-palette $MaterialDesignColor = array( array( 255 , 235 , 238 ), array( 255 , 205 , 210 ), array( 239 , 154 , 154 ), array( 229 , 115 , 115 ), array( 239 , 83 , 80 ), array( 244 , 67 , 54 ), array( 229 , 57 , 53 ), array( 211 , 47 , 47 ), array( 198 , 40 , 40 ), array( 183 , 28 , 28 ), array( 255 , 138 , 128 ), array( 255 , 82 , 82 ), array( 255 , 23 , 68 ), array( 213 , 0 , 0 ), array( 252 , 228 , 236 ), array( 248 , 187 , 208 ), array( 244 , 143 , 177 ), array( 240 , 98 , 146 ), array( 236 , 64 , 122 ), array( 233 , 30 , 99 ), array( 216 , 27 , 96 ), array( 194 , 24 , 91 ), array( 173 , 20 , 87 ), array( 136 , 14 , 79 ), array( 255 , 128 , 171 ), array( 255 , 64 , 129 ), array( 245 , 0 , 87 ), array( 197 , 17 , 98 ), array( 243 , 229 , 245 ), array( 225 , 190 , 231 ), array( 206 , 147 , 216 ), array( 186 , 104 , 200 ), array( 171 , 71 , 188 ), array( 156 , 39 , 176 ), array( 142 , 36 , 170 ), array( 123 , 31 , 162 ), array( 106 , 27 , 154 ), array( 74 , 20 , 140 ), array( 234 , 128 , 252 ), array( 224 , 64 , 251 ), array( 213 , 0 , 249 ), array( 170 , 0 , 255 ), array( 237 , 231 , 246 ), array( 209 , 196 , 233 ), array( 179 , 157 , 219 ), array( 149 , 117 , 205 ), array( 126 , 87 , 194 ), array( 103 , 58 , 183 ), array( 94 , 53 , 177 ), array( 81 , 45 , 168 ), array( 69 , 39 , 160 ), array( 49 , 27 , 146 ), array( 179 , 136 , 255 ), array( 124 , 77 , 255 ), array( 101 , 31 , 255 ), array( 98 , 0 , 234 ), array( 232 , 234 , 246 ), array( 197 , 202 , 233 ), array( 159 , 168 , 218 ), array( 121 , 134 , 203 ), array( 92 , 107 , 192 ), array( 63 , 81 , 181 ), array( 57 , 73 , 171 ), array( 48 , 63 , 159 ), array( 40 , 53 , 147 ), array( 26 , 35 , 126 ), array( 140 , 158 , 255 ), array( 83 , 109 , 254 ), array( 61 , 90 , 254 ), array( 48 , 79 , 254 ), array( 227 , 242 , 253 ), array( 187 , 222 , 251 ), array( 144 , 202 , 249 ), array( 100 , 181 , 246 ), array( 66 , 165 , 245 ), array( 33 , 150 , 243 ), array( 30 , 136 , 229 ), array( 25 , 118 , 210 ), array( 21 , 101 , 192 ), array( 13 , 71 , 161 ), array( 130 , 177 , 255 ), array( 68 , 138 , 255 ), array( 41 , 121 , 255 ), array( 41 , 98 , 255 ), array( 225 , 245 , 254 ), array( 179 , 229 , 252 ), array( 129 , 212 , 250 ), array( 79 , 195 , 247 ), array( 41 , 182 , 252 ), array( 3 , 169 , 244 ), array( 3 , 155 , 229 ), array( 2 , 136 , 209 ), array( 2 , 119 , 189 ), array( 1 , 87 , 155 ), array( 128 , 216 , 255 ), array( 64 , 196 , 255 ), array( 0 , 176 , 255 ), array( 0 , 145 , 234 ), array( 224 , 247 , 250 ), array( 178 , 235 , 242 ), array( 128 , 222 , 234 ), array( 77 , 208 , 225 ), array( 38 , 198 , 218 ), array( 0 , 188 , 212 ), array( 0 , 172 , 193 ), array( 0 , 151 , 167 ), array( 0 , 131 , 143 ), array( 0 , 96 , 100 ), array( 132 , 255 , 255 ), array( 24 , 255 , 255 ), array( 0 , 229 , 255 ), array( 0 , 184 , 212 ), array( 224 , 242 , 241 ), array( 178 , 223 , 219 ), array( 128 , 203 , 196 ), array( 77 , 182 , 172 ), array( 38 , 166 , 154 ), array( 0 , 150 , 136 ), array( 0 , 137 , 123 ), array( 0 , 121 , 107 ), array( 0 , 105 , 92 ), array( 0 , 77 , 64 ), array( 167 , 255 , 235 ), array( 100 , 255 , 218 ), array( 29 , 233 , 182 ), array( 0 , 191 , 165 ), array( 232 , 245 , 233 ), array( 200 , 230 , 201 ), array( 165 , 214 , 167 ), array( 129 , 199 , 132 ), array( 102 , 187 , 106 ), array( 76 , 175 , 80 ), array( 67 , 160 , 71 ), array( 56 , 142 , 60 ), array( 46 , 125 , 50 ), array( 27 , 94 , 32 ), array( 185 , 246 , 202 ), array( 105 , 240 , 174 ), array( 0 , 230 , 118 ), array( 0 , 200 , 83 ), array( 241 , 248 , 233 ), array( 220 , 237 , 200 ), array( 197 , 225 , 165 ), array( 174 , 213 , 129 ), array( 156 , 204 , 101 ), array( 139 , 195 , 74 ), array( 124 , 179 , 66 ), array( 104 , 159 , 56 ), array( 85 , 139 , 47 ), array( 51 , 105 , 30 ), array( 204 , 255 , 144 ), array( 178 , 255 , 89 ), array( 118 , 255 , 3 ), array( 100 , 221 , 23 ), array( 249 , 251 , 231 ), array( 240 , 244 , 195 ), array( 230 , 238 , 156 ), array( 220 , 231 , 117 ), array( 212 , 225 , 87 ), array( 205 , 220 , 57 ), array( 192 , 202 , 51 ), array( 164 , 180 , 43 ), array( 158 , 157 , 36 ), array( 130 , 119 , 23 ), array( 244 , 255 , 129 ), array( 238 , 255 , 65 ), array( 198 , 255 , 0 ), array( 174 , 234 , 0 ), array( 255 , 253 , 231 ), array( 255 , 249 , 196 ), array( 255 , 245 , 144 ), array( 255 , 241 , 118 ), array( 255 , 238 , 88 ), array( 255 , 235 , 59 ), array( 253 , 216 , 53 ), array( 251 , 192 , 45 ), array( 249 , 168 , 37 ), array( 245 , 127 , 23 ), array( 255 , 255 , 130 ), array( 255 , 255 , 0 ), array( 255 , 234 , 0 ), array( 255 , 214 , 0 ), array( 255 , 248 , 225 ), array( 255 , 236 , 179 ), array( 255 , 224 , 130 ), array( 255 , 213 , 79 ), array( 255 , 202 , 40 ), array( 255 , 193 , 7 ), array( 255 , 179 , 0 ), array( 255 , 160 , 0 ), array( 255 , 143 , 0 ), array( 255 , 111 , 0 ), array( 255 , 229 , 127 ), array( 255 , 215 , 64 ), array( 255 , 196 , 0 ), array( 255 , 171 , 0 ), array( 255 , 243 , 224 ), array( 255 , 224 , 178 ), array( 255 , 204 , 128 ), array( 255 , 183 , 77 ), array( 255 , 167 , 38 ), array( 255 , 152 , 0 ), array( 251 , 140 , 0 ), array( 245 , 124 , 0 ), array( 239 , 108 , 0 ), array( 230 , 81 , 0 ), array( 255 , 209 , 128 ), array( 255 , 171 , 64 ), array( 255 , 145 , 0 ), array( 255 , 109 , 0 ), array( 251 , 233 , 167 ), array( 255 , 204 , 188 ), array( 255 , 171 , 145 ), array( 255 , 138 , 101 ), array( 255 , 112 , 67 ), array( 255 , 87 , 34 ), array( 244 , 81 , 30 ), array( 230 , 74 , 25 ), array( 216 , 67 , 21 ), array( 191 , 54 , 12 ), array( 255 , 158 , 128 ), array( 255 , 110 , 64 ), array( 255 , 61 , 0 ), array( 221 , 38 , 0 ), array( 239 , 235 , 233 ), array( 215 , 204 , 200 ), array( 188 , 170 , 164 ), array( 161 , 136 , 127 ), array( 141 , 110 , 99 ), array( 121 , 85 , 72 ), array( 109 , 76 , 65 ), array( 93 , 64 , 55 ), array( 78 , 52 , 46 ), array( 62 , 39 , 35 ), array( 250 , 250 , 250 ), array( 245 , 245 , 245 ), array( 238 , 238 , 238 ), array( 224 , 224 , 224 ), array( 189 , 189 , 189 ), array( 158 , 158 , 158 ), array( 117 , 117 , 117 ), array( 97 , 97 , 97 ), array( 66 , 66 , 66 ), array( 33 , 33 , 33 ), array( 0 , 0 , 0 ), array( 255 , 255 , 255 ), array( 236 , 239 , 241 ), array( 207 , 216 , 220 ), array( 176 , 187 , 197 ), array( 144 , 164 , 174 ), array( 120 , 144 , 156 ), array( 96 , 125 , 139 ), array( 84 , 110 , 122 ), array( 69 , 90 , 100 ), array( 55 , 71 , 79 ), array( 38 , 50 , 56 ) ); $BackgroundColorIndex = mt_rand(0, count($MaterialDesignColor)-1); $BackgroundColor = imagecolorallocate($this->Avatar, $MaterialDesignColor[$BackgroundColorIndex][0], $MaterialDesignColor[$BackgroundColorIndex][1], $MaterialDesignColor[$BackgroundColorIndex][2] ); //画一个居中圆形 imagefilledellipse($this->Avatar, $Width/2, $Height/2, $Width, $Height, $BackgroundColor ); //字体 $FontColor = imagecolorallocate($this->Avatar, 255, 255, 255); if($this->IsNotletter){ //中文字符偏移 $FontSize = $Width - $Padding * 3.5; $X = $Padding + (-2/166)*$FontSize; $Y = $Height - $Padding - (23.5/166) * $FontSize; }else{ $FontSize = $Width - $Padding * 2; $X = $Padding + (20/196)*$FontSize; $Y = $Height - $Padding - (13/196)*$FontSize; } // 在圆正中央填入字符 imagettftext($this->Avatar, $FontSize, 0, $X, $Y, $FontColor, $this->FontFile, $this->Char ); } private function Resize($TargetSize) { if (isset($this->Avatar)) { if ($this->AvatarSize > $TargetSize) { $Percent = $TargetSize / $this->AvatarSize; $TargetWidth = round($this->AvatarSize * $Percent); $TargetHeight = round($this->AvatarSize * $Percent); $TargetImageData = imagecreatetruecolor($TargetWidth, $TargetHeight); //全透明背景 imageSaveAlpha($TargetImageData, true); $BackgroundAlpha = imagecolorallocatealpha($TargetImageData, 255, 255, 255, 127); imagefill($TargetImageData, 0, 0, $BackgroundAlpha); imagecopyresampled($TargetImageData, $this->Avatar, 0, 0, 0, 0, $TargetWidth, $TargetHeight, $this->AvatarSize, $this->AvatarSize); return $TargetImageData; } else { return $this->Avatar; } } else { return false; } } public function Free() { imagedestroy($this->Avatar); } public function Output2Browser($AvatarSize=0) { if(!$AvatarSize){ $AvatarSize = $this->AvatarSize; } header ('Content-Type: image/png'); return imagepng($this->Resize($AvatarSize)); } public function Save($Path, $AvatarSize=0) { if(!$AvatarSize){ $AvatarSize = $this->AvatarSize; } return imagepng($this->Resize($AvatarSize), $Path); } }