├── .gitignore ├── .travis.yml ├── LICENSE ├── README.md ├── composer.json ├── doc ├── blue.png ├── green.png └── red.png ├── phpunit.xml.dist ├── src ├── Initialcon.php └── OpenSans-Regular.ttf └── tests └── Initialcon └── Tests └── InitialconTest.php /.gitignore: -------------------------------------------------------------------------------- 1 | examples/ 2 | vendor/ 3 | composer.lock 4 | composer.phar 5 | phpunit.xml 6 | php-cs-fixer.phar 7 | .DS_Store 8 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: php 2 | php: 3 | - 5.6 4 | - 7.0 5 | - 7.1 6 | before_script: 7 | - composer install 8 | script: phpunit --coverage-text 9 | notifications: 10 | slack: 11 | secure: dtCEbnISh0tdlKl6eXcdDNwK7y0cgIg3V4lnrpanzSosj1ZbO9LKsnW5hh3q2+LLL8PTxjJurQKm4GwM+aOUiNveGCLUgn4sDYkubILPHxykYcGTRvXEFHaEx57nZXLibF3yMYni3BPp5/vcK6Duy7FHb5wL+HRQqlPX6XE3k90= 12 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Permission is hereby granted, free of charge, to any person obtaining a copy 2 | of this software and associated documentation files (the "Software"), to deal 3 | in the Software without restriction, including without limitation the rights 4 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 5 | copies of the Software, and to permit persons to whom the Software is furnished 6 | to do so, subject to the following conditions: 7 | 8 | The above copyright notice and this permission notice shall be included in all 9 | copies or substantial portions of the Software. 10 | 11 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 12 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 13 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 14 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 15 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 16 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 17 | THE SOFTWARE. 18 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Initial based icon generator for PHP 2 | 3 | [![Build Status](https://secure.travis-ci.org/runmybusiness/initialcon.png)](http://travis-ci.org/runmybusiness/initialcon) 4 | [![StyleCI](https://styleci.io/repos/20169615/shield)](https://styleci.io/repos/20169615) 5 | [![Latest Stable Version](https://poser.pugx.org/runmybusiness/initialcon/v/stable)](https://packagist.org/packages/runmybusiness/initialcon) [![Total Downloads](https://poser.pugx.org/runmybusiness/initialcon/downloads)](https://packagist.org/packages/runmybusiness/initialcon) [![Latest Unstable Version](https://poser.pugx.org/runmybusiness/initialcon/v/unstable)](https://packagist.org/packages/runmybusiness/initialcon) [![License](https://poser.pugx.org/runmybusiness/initialcon/license)](https://packagist.org/packages/runmybusiness/initialcon) 6 | 7 | 8 | 9 | 10 | ![Initialcon example #1](doc/red.png)   11 | ![Initialcon example #2](doc/blue.png)   12 | ![Initialcon example #3](doc/green.png)   13 | 14 | ## Installation 15 | 16 | The recommended way to install Initialcon is through composer. 17 | 18 | Just create a `composer.json` file for your project: 19 | 20 | ``` json 21 | { 22 | "require": { 23 | "runmybusiness/initialcon": "*" 24 | } 25 | } 26 | ``` 27 | 28 | And run these two commands to install it: 29 | 30 | ``` bash 31 | $ wget http://getcomposer.org/composer.phar 32 | $ php composer.phar install 33 | ``` 34 | 35 | Now you can add the autoloader (if your framework doesn't already do this for you), and you will have access to the library: 36 | 37 | ``` php 38 | displayImage('TS', 'tom@test.com'); 64 | ``` 65 | 66 | or generate and get the image data 67 | 68 | ``` php 69 | $imageData = $initialcon->getImageData('TS', 'tom@test.com'); 70 | ``` 71 | 72 | or generate and get the base 64 image uri ready for integrate into an HTML img tag. 73 | 74 | ``` php 75 | $imageDataUri = $initialcon->getImageDataUri('HI', 'hello@test.com'); 76 | ``` 77 | ``` html 78 | bar Initialcon 79 | ``` 80 | 81 | 82 | ### Change the size 83 | 84 | By default the size will be 64 pixels. If you want to change the image size just add a secondary parameter. 512 x 512px in this example. 85 | 86 | ``` php 87 | $initialcon->displayImage('TS', 'tom@test.com', 512); 88 | ``` 89 | 90 | ### Color 91 | 92 | The color is automaticaly generated according to the string hash but you can chose to specify a color by adding a third argument. 93 | 94 | Color can be an hexadecimal with 6 characters 95 | 96 | ``` php 97 | $initialcon->displayImage('TS', 'tom@test.com', 64, 'A87EDF'); 98 | ``` 99 | 100 | ### Image Object 101 | 102 | You can also grab the Image object to add more manipulation to the final icon (such as rounded corders, opacity, etc). 103 | We use the [Intervention](http://image.intervention.io/) library for image creation so all of its' methods are available to you. 104 | 105 | ```php 106 | $initialcon->getImageObject('TS', 'tom@test.com', 512); 107 | ``` 108 | 109 | That's it! 110 | 111 | ## Unit Tests 112 | 113 | To run unit tests, you'll need and a set of dependencies you can install using Composer: 114 | 115 | ``` 116 | php composer.phar install 117 | ``` 118 | 119 | Once installed, just launch the following command: 120 | 121 | ``` 122 | phpunit 123 | ``` 124 | 125 | Everythings should be ok. 126 | 127 | 128 | ## Credits 129 | 130 | * Originally forkeed from Benjamin Laugueux's great Identicon library at (https://github.com/yzalis/Initialcon) 131 | 132 | 133 | ## License 134 | 135 | Initialcon is released under the MIT License. See the bundled LICENSE file for details. 136 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "runmybusiness/initialcon", 3 | "type": "library", 4 | "description": "Create a GMail esque avatar based on the users intials & a persistant identifier such as an email address.", 5 | "keywords": ["initialcon", "avatar", "image", "picture", "icon"], 6 | "homepage": "http://runmybusiness.com", 7 | "license": "MIT", 8 | "authors": [ 9 | { 10 | "name": "Tom Schlick", 11 | "email": "tom@runmybusiness.com" 12 | } 13 | ], 14 | "require": { 15 | "php": ">=5.4.0", 16 | "intervention/image": "2.*" 17 | }, 18 | "require-dev": { 19 | "fzaninotto/faker": "1.2.*@dev" 20 | }, 21 | "autoload": { 22 | "psr-4": { "RunMyBusiness\\Initialcon\\": "src/" } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /doc/blue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runmybusiness/initialcon/5cf314fcf72b3725c9cc2cecd52ca4e65de51a78/doc/blue.png -------------------------------------------------------------------------------- /doc/green.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runmybusiness/initialcon/5cf314fcf72b3725c9cc2cecd52ca4e65de51a78/doc/green.png -------------------------------------------------------------------------------- /doc/red.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runmybusiness/initialcon/5cf314fcf72b3725c9cc2cecd52ca4e65de51a78/doc/red.png -------------------------------------------------------------------------------- /phpunit.xml.dist: -------------------------------------------------------------------------------- 1 | 2 | 13 | 14 | 15 | ./tests/ 16 | 17 | 18 | 19 | 20 | ./src/Initialcon/ 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /src/Initialcon.php: -------------------------------------------------------------------------------- 1 | size = $size; 49 | $this->pixelRatio = round($size / 5); 50 | 51 | return $this; 52 | } 53 | 54 | /** 55 | * Get the image size. 56 | * 57 | * @return int 58 | */ 59 | public function getSize() 60 | { 61 | return $this->size; 62 | } 63 | 64 | /** 65 | * Get the text size. 66 | * 67 | * @return int 68 | */ 69 | public function getTextSize() 70 | { 71 | return (strlen($this->initials) === 2) ? round($this->size / 1.5) : $this->size; 72 | } 73 | 74 | /** 75 | * Generate a hash fron the identifier. 76 | * 77 | * @param string $string 78 | * 79 | * @return Initialcon 80 | */ 81 | public function setInitials($initials) 82 | { 83 | if (null === $initials) { 84 | throw new \Exception('The initials cannot be null.'); 85 | } 86 | 87 | $this->initials = substr($initials, 0, 2); 88 | 89 | return $this; 90 | } 91 | 92 | /** 93 | * Generate a hash fron the identifier. 94 | * 95 | * @param string $string 96 | * 97 | * @return Initialcon 98 | */ 99 | public function setIdentifier($identifier) 100 | { 101 | if (null === $identifier) { 102 | throw new \Exception('The identifier cannot be null.'); 103 | } 104 | 105 | $this->hash = md5($identifier); 106 | 107 | $this->convertHashToArrayOfBoolean(); 108 | 109 | return $this; 110 | } 111 | 112 | /** 113 | * Get the Initialcon string hash. 114 | * 115 | * @return string 116 | */ 117 | public function getHash() 118 | { 119 | return $this->hash; 120 | } 121 | 122 | /** 123 | * Convert the hash into an multidimensionnal array of boolean. 124 | * 125 | * @return Initialcon 126 | */ 127 | private function convertHashToArrayOfBoolean() 128 | { 129 | preg_match_all('/(\w)(\w)/', $this->hash, $chars); 130 | 131 | $this->color[0] = hexdec(array_pop($chars[1])) * 16; 132 | $this->color[1] = hexdec(array_pop($chars[1])) * 16; 133 | $this->color[2] = hexdec(array_pop($chars[1])) * 16; 134 | 135 | return $this; 136 | } 137 | 138 | /** 139 | * Convert an heaxecimal number into a boolean. 140 | * 141 | * @param string $hexa 142 | * 143 | * @return bool 144 | */ 145 | private function convertHexaToBoolean($hexa) 146 | { 147 | return (bool) intval(round(hexdec($hexa) / 10)); 148 | } 149 | 150 | /** 151 | * Generate the Initialcon image. 152 | * 153 | * @param string $string 154 | * @param int $size 155 | * @param string $hexaColor 156 | */ 157 | private function generateImage($initials, $identifier, $size, $color) 158 | { 159 | $this->setInitials($initials); 160 | $this->setIdentifier($identifier); 161 | $this->setSize($size); 162 | $textSize = $this->getTextSize(); 163 | 164 | if ($this->fontPath === null) { 165 | $this->setFontPath(__DIR__.'/OpenSans-Regular.ttf'); 166 | } 167 | 168 | $fontFilePath = $this->getFontPath(); 169 | 170 | // prepage the color 171 | if (null !== $color) { 172 | $this->setColor($color); 173 | } 174 | 175 | $image = Image::canvas($size, $size, $this->getColor()); 176 | 177 | $image->text($this->initials, ($size / 2), ($size / 2), function ($font) use ($textSize, $fontFilePath) { 178 | $font->size($textSize); 179 | $font->color('#ffffff'); 180 | $font->align('center'); 181 | $font->valign('middle'); 182 | $font->file($fontFilePath); 183 | }); 184 | 185 | return $image; 186 | } 187 | 188 | /** 189 | * Set the image color. 190 | * 191 | * @param string $color The color in hexa (6 chars) 192 | * 193 | * @return Initialcon 194 | */ 195 | public function setColor($color) 196 | { 197 | if (false !== strpos($color, '#')) { 198 | $color = substr($color, 1); 199 | } 200 | $this->color = hexdec(substr($color, 0, 2)); 201 | $this->color .= hexdec(substr($color, 2, 2)); 202 | $this->color .= hexdec(substr($color, 4, 2)); 203 | 204 | return $this; 205 | } 206 | 207 | /** 208 | * Get the color. 209 | * 210 | * @return string 211 | */ 212 | public function getColor() 213 | { 214 | return $this->color; 215 | } 216 | 217 | /** 218 | * Get the font path. 219 | * 220 | * @return string 221 | */ 222 | public function getFontPath() 223 | { 224 | return realpath($this->fontPath); 225 | } 226 | 227 | /** 228 | * Set the font path. 229 | * 230 | * @param string $path 231 | */ 232 | public function setFontPath($path) 233 | { 234 | $this->fontPath = $path; 235 | } 236 | 237 | /** 238 | * Display an Initialcon image. 239 | * 240 | * @param string $initials 241 | * @param string $identifier 242 | * @param int $size 243 | * @param string $hexaColor 244 | */ 245 | public function displayImage($initials, $identifier, $size = 64, $hexaColor = null) 246 | { 247 | header('Content-Type: image/png'); 248 | $img = $this->generateImage($initials, $identifier, $size, $hexaColor); 249 | echo $img->encode('png'); 250 | } 251 | 252 | /** 253 | * Display an Initialcon image. 254 | * 255 | * @param string $initials 256 | * @param string $identifier 257 | * @param int $size 258 | * @param string $hexaColor 259 | * 260 | * @return Image 261 | */ 262 | public function getImageObject($initials, $identifier, $size = 64, $hexaColor = null) 263 | { 264 | return $this->generateImage($initials, $identifier, $size, $hexaColor); 265 | } 266 | 267 | /** 268 | * Get an Initialcon PNG image data. 269 | * 270 | * @param string $initials 271 | * @param string $identifier 272 | * @param int $size 273 | * @param string $hexaColor 274 | * 275 | * @return string 276 | */ 277 | public function getImageData($initials, $identifier, $size = 64, $hexaColor = null) 278 | { 279 | $img = $this->generateImage($initials, $identifier, $size, $hexaColor); 280 | 281 | return $img->encode('png'); 282 | } 283 | 284 | /** 285 | * Get an Initialcon PNG image data. 286 | * 287 | * @param string $initials 288 | * @param string $identifier 289 | * @param int $size 290 | * @param string $hexaColor 291 | * 292 | * @return string 293 | */ 294 | public function getImageDataUri($initials, $identifier, $size = 64, $hexaColor = null) 295 | { 296 | return sprintf('data:image/png;base64,%s', base64_encode($this->getImageData($initials, $identifier, $size, $hexaColor))); 297 | } 298 | } 299 | -------------------------------------------------------------------------------- /src/OpenSans-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runmybusiness/initialcon/5cf314fcf72b3725c9cc2cecd52ca4e65de51a78/src/OpenSans-Regular.ttf -------------------------------------------------------------------------------- /tests/Initialcon/Tests/InitialconTest.php: -------------------------------------------------------------------------------- 1 | faker = \Faker\Factory::create(); 15 | $this->initialcon = new Initialcon(); 16 | } 17 | 18 | public function testHash() 19 | { 20 | for ($i = 0; $i < 10; $i++) { 21 | // Get the previous hash 22 | $previousHash = $this->initialcon->getHash(); 23 | 24 | // Set a new string 25 | $this->initialcon->setIdentifier($this->faker->email); 26 | $this->initialcon->setInitials($this->faker->firstname); 27 | 28 | // Test the hash length 29 | $this->assertEquals(32, strlen($this->initialcon->getHash())); 30 | 31 | // Test the hash generation result 32 | $this->assertThat( 33 | $this->initialcon->getHash(), 34 | $this->logicalNot( 35 | $this->equalTo($previousHash) 36 | ) 37 | ); 38 | } 39 | } 40 | 41 | /** 42 | * @dataProvider testColorDataProvider 43 | */ 44 | public function testColor($color, $expected) 45 | { 46 | $expected = $expected[0].$expected[1].$expected[2]; 47 | $this->assertEquals($expected, $this->initialcon->setColor($color)->getColor()); 48 | } 49 | 50 | public function testColorDataProvider() 51 | { 52 | return [ 53 | ['#ffffff', [255, 255, 255]], 54 | ['ffffff', [255, 255, 255]], 55 | ['000000', [0, 0, 0]], 56 | ]; 57 | } 58 | 59 | /** 60 | * @dataProvider resultDataProvider 61 | */ 62 | public function testResult($initials, $identifier, $imageData) 63 | { 64 | $this->assertEquals($imageData, $this->initialcon->getImageDataUri($initials, $identifier, 128)); 65 | } 66 | 67 | public function resultDataProvider() 68 | { 69 | return [ 70 | ['TS', 'tom@test.com', 'data:image/png;base64,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'], 71 | ['HI', 'hello@test.com', 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAB/0lEQVR4nO3bIWuWURiA4TMxq//EgcE6WBqGfZg0rc2y8KXB1xYEm6wJK4JFGBYxqMEgigjiLxCDv2RGQT4sU4/zvq564H2ecHNe3vBuLDa3zgZZl2YvwFwCiBNAnADiBBAngDgBxAkgTgBxAogTQJwA4gQQJ4A4AcQJIE4AcQKIE0CcAOIEECeAOAHECSBOAHECiBNAnADiBBAngDgBxAkgTgBxAoi7PHuBdQ6ODsf27s7as5MHx+Pl6fO/vNEP27s74+DocO3Zu1dvxsPV/XM9f295byz27qw9e/ro8Tg9eXKu5//MDRAngDgBxAkgTgBxAogTQJwA4gQQJ4A4AcQJIE4AcQKIE0CcAOIEECeAOAHECSBOAHECiBNAnADiBBD3T/4Z9Cv7q+XYXy1nr/HfcAPECSBOAHECiBNA3IX7Cnj97MX4/P7jtPnXb94Yt+7enjb/d7twAXz78nV8evth2vwr165Om/0neAXECSBOAHECiBNAnADiBBAngDgBxAkgTgBxAogTQJwA4gQQJ4A4AcQJIE4AcQKIE0CcAOIEECeAOAHECSBOAHEbi82ts9lLMI8bIE4AcQKIE0CcAOIEECeAOAHECSBOAHECiBNAnADiBBAngDgBxAkgTgBxAogTQJwA4gQQJ4A4AcQJIE4AcQKIE0CcAOIEECeAuO9RciQ7x6j8GQAAAABJRU5ErkJggg=='], 72 | ]; 73 | } 74 | } 75 | --------------------------------------------------------------------------------