Generator()
Description #
Avatar generator.
Source #
File: addons/avatar/class-generator.php
class Generator {
/**
* Name of user.
*
* @var string
*/
public $name = 'ap';
/**
* User ID.
*
* @var integer
*/
public $user_id = 0;
/**
* Avatar file name.
*
* @var string
*/
public $filename = '';
/**
* Charecter to show in avatar
*
* @var integer
*/
public $char_count = 2;
/**
* Text color.
*
* @var string
*/
public $text_color = '#ffffff';
/**
* Height of image.
*
* @var integer
*/
public $height = 40;
/**
* Width of image.
*
* @var integer
*/
public $width = 40;
/**
* Font weight.
*
* @var integer
*/
public $font_weight = 600;
/**
* Font family
*
* @var string
*/
public $font_size = 25;
/**
* Colors
*
* @var array
*/
public $colors = array();
/**
* Initialize the class.
*
* @param integer|string $user User ID or name if non-loggedin user.
*/
public function __construct( $user ) {
if ( is_object( $user ) && ! empty( $user->user_id ) ) {
$this->user_id = (int) $user->user_id;
$user = get_userdata( $this->user_id );
$this->name = esc_attr( $user->display_name );
} elseif ( is_object( $user ) && $user instanceof \WP_user ) {
$this->name = esc_attr( $user->display_name );
$this->user_id = $user->ID;
} elseif ( is_object( $user ) && $user instanceof \WP_Comment ) {
$this->name = esc_attr( $user->comment_author );
$this->user_id = $user->user_id;
} elseif ( is_numeric( $user ) && ! empty( $user ) ) {
$user = get_user_by( 'id', $user );
$this->name = esc_attr( $user->display_name );
$this->user_id = $user->ID;
} else {
$this->name = empty( $user ) ? 'anonymous' : esc_attr( $user );
$this->user_id = empty( $user ) ? 'anonymous' : $this->name;
}
$this->colors();
$this->filename();
}
/**
* File name of a avatar.
*/
public function filename() {
$this->filename = md5( $this->user_id );
}
/**
* Background colors to be used in image.
* Extracted from Google's metallic color.
*/
public function colors() {
$colors = array( '#EA526F', '#FF0038', '#3C91E6', '#D64933', '#00A878', '#0A2472', '#736B92', '#FFAD05', '#DD9787', '#74D3AE', '#B9314F', '#878472', '#983628', '#E2AEDD', '#1B9AAA', '#FFC43D', '#4F3824', '#7A6F9B', '#376996', '#7B904B', '#613DC1' );
/**
* Filters avatar addon colors.
*
* Use this filter to override or add custom colors for avatar.
* Colors are selected randomly while creating avatar.
*
* @param array $colors List of default colors.
* @since 4.0.11 Introduced. Requested at @link https://goo.gl/yXN7og.
*
* @return array
*/
$this->colors = apply_filters( 'ap_addon_avatar_colors', $colors );
}
/**
* Check if avatar for a user already exists.
*
* @return boolean
*/
public function avatar_exists() {
$upload_dir = wp_upload_dir();
$avatar_dir = $upload_dir['basedir'] . '/ap_avatars';
return file_exists( $avatar_dir . '/' . $this->filename . '.jpg' );
}
/**
* Return avatar file path.
*
* @return string
*/
public function filepath() {
$upload_dir = wp_upload_dir();
$avatar_dir = $upload_dir['basedir'] . '/ap_avatars';
// Make dir if does not exists already.
if ( ! file_exists( $avatar_dir ) ) {
wp_mkdir_p( $avatar_dir );
}
return $avatar_dir . '/' . $this->filename . '.jpg';
}
/**
* Return url to avatar.
*
* @return string
*/
public function fileurl() {
$upload_dir = wp_upload_dir();
$avatar_dir = $upload_dir['baseurl'] . '/ap_avatars';
return $avatar_dir . '/' . $this->filename . '.jpg';
}
/**
* Function to generate letter avatar
*/
public function generate() {
if ( ! function_exists( 'imagecreatetruecolor' ) || $this->avatar_exists() ) {
return;
}
$font = ap_get_theme_location( 'avatar-fonts/' . ap_opt( 'avatar_font' ) . '.ttf' );
$words = explode( ' ', $this->name );
$text = '';
foreach ( $words as $w ) {
$text .= strtoupper( $w[0] );
}
$text = preg_replace( '~^(&([a-zA-Z0-9]);)~', htmlentities( '${1}' ), $text );
// Convert hex code to RGB.
$text_color = $this->hex_to_rgb( $this->text_color );
$im = imagecreatetruecolor( 90, 90 );
$text_color = imagecolorallocate( $im, $text_color['r'], $text_color['g'], $text_color['b'] );
// Random background Colors.
$color_key = array_rand( $this->colors );
$bg_color = $this->colors[ $color_key ];
$this->image_gradientrect( $im, $bg_color, $this->color_luminance( $bg_color, 0.10 ) );
list($x, $y) = $this->image_center( $im, $text, $font, $this->font_size );
imagettftext( $im, $this->font_size, 0, $x, $y, $text_color, $font, $text );
if ( imagejpeg( $im, $this->filepath(), 90 ) ) {
imagedestroy( $im );
}
}
/**
* Convert hex value to rgb.
*
* @param string $color Hex color.
* @return array
*/
protected function hex_to_rgb( $color ) {
if ( '#' === $color[0] ) {
$color = substr( $color, 1 );
}
if ( 6 === strlen( $color ) ) {
list( $r, $g, $b ) = array( $color[0] . $color[1], $color[2] . $color[3], $color[4] . $color[5] );
} elseif ( 3 === strlen( $color ) ) {
list( $r, $g, $b ) = array( $color[0] . $color[0], $color[1] . $color[1], $color[2] . $color[2] );
} else {
return false;
}
$r = hexdec( $r );
$g = hexdec( $g );
$b = hexdec( $b );
return array(
'r' => $r,
'g' => $g,
'b' => $b,
);
}
/**
* Get center position on image.
*
* @param \GdImage|false $image Image resource.
* @param string $text Text.
* @param string $font Font file path.
* @param string $size Size of image.
* @param integer $angle Angle.
* @return array
*/
protected function image_center( $image, $text, $font, $size, $angle = 8 ) {
$xi = imagesx( $image );
$yi = imagesy( $image );
$box = imagettfbbox( $size, $angle, $font, $text );
$xr = abs( max( $box[2], $box[4] ) );
$yr = abs( max( $box[5], $box[7] ) );
$x = intval( ( $xi - $xr ) / 2 );
$y = intval( ( $yi + $yr ) / 2 );
return array( $x, $y );
}
/**
* Fill gradient.
*
* @param \GdImage $img Image resource.
* @param string $start Start color.
* @param string $end End color.
* @return boolean
*/
private function image_gradientrect( $img, $start, $end ) {
$x = 0;
$y = 0;
$x1 = 90;
$y1 = 90;
if ( $x > $x1 || $y > $y1 ) {
return false;
}
$start = str_replace( '#', '', $start );
$end = str_replace( '#', '', $end );
$s = array(
hexdec( substr( $start, 0, 2 ) ),
hexdec( substr( $start, 2, 2 ) ),
hexdec( substr( $start, 4, 2 ) ),
);
$e = array(
hexdec( substr( $end, 0, 2 ) ),
hexdec( substr( $end, 2, 2 ) ),
hexdec( substr( $end, 4, 2 ) ),
);
$steps = $y1 - $y;
for ( $i = 0; $i < $steps; $i++ ) {
$r = $s[0] - ( ( ( $s[0] - $e[0] ) / $steps ) * $i );
$g = $s[1] - ( ( ( $s[1] - $e[1] ) / $steps ) * $i );
$b = $s[2] - ( ( ( $s[2] - $e[2] ) / $steps ) * $i );
$color = imagecolorallocate( $img, $r, $g, $b );
imagefilledrectangle( $img, $x, $y + $i, $x1, $y + $i + 1, $color );
}
return true;
}
/**
* Lightens/darkens a given colour (hex format), returning the altered colour in hex format.
*
* @param string $hex Colour as hexadecimal (with or without hash).
* @param float $percent float $percent Decimal ( 0.2 = lighten by 20%(), -0.4 = darken by 40%() ).
* @return string Lightened/Darkend colour as hexadecimal (with hash);
*/
private function color_luminance( $hex, $percent ) {
// Validate hex string.
$hex = preg_replace( '/[^0-9a-f]/i', '', $hex );
$new_hex = '#';
if ( strlen( $hex ) < 6 ) {
$hex = $hex[0] + $hex[0] + $hex[1] + $hex[1] + $hex[2] + $hex[2];
}
// Convert to decimal and change luminosity.
for ( $i = 0; $i < 3; $i++ ) {
$dec = hexdec( substr( $hex, $i * 2, 2 ) );
$dec = min( max( 0, $dec + $dec * $percent ), 255 );
$new_hex .= str_pad( dechex( $dec ), 2, 0, STR_PAD_LEFT );
}
return $new_hex;
}
}
Expand full source code Collapse full source code View on GitHub: addons/avatar/class-generator.php:26
Add your comment