├── .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 | [](http://travis-ci.org/runmybusiness/initialcon)
4 | [](https://styleci.io/repos/20169615)
5 | [](https://packagist.org/packages/runmybusiness/initialcon) [](https://packagist.org/packages/runmybusiness/initialcon) [](https://packagist.org/packages/runmybusiness/initialcon) [](https://packagist.org/packages/runmybusiness/initialcon)
6 |
7 |
8 |
9 |
10 | 
11 | 
12 | 
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 |
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 |
--------------------------------------------------------------------------------