Last active
August 29, 2015 13:57
-
-
Save mistic100/9433924 to your computer and use it in GitHub Desktop.
[PHP] Write text on image with silkscreen font
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <?php | |
| /** | |
| * Write text on image with silkscreen font http://kottke.org/plus/type/silkscreen | |
| * | |
| * Usage: | |
| * $img = imagecreatetruecolor(65, 15); | |
| * $bg = imagecolorallocate($img, 0, 0, 0); | |
| * $fg = imagecolorallocate($img, 255, 255, 255); | |
| * | |
| * silk::write($img, 5, 5, 'Hello world', $fg, 1, false, 0); | |
| * | |
| * header("Content-Type: image/png"); | |
| * imagepng($img); | |
| */ | |
| class silk { | |
| static $map; | |
| static function write($im, $x, $y, $text, $color=null, $size=1, $bold=false, $spacing=0) | |
| { | |
| if (empty(self::$map)) | |
| { | |
| self::buildMap(); | |
| } | |
| if (!isset($color)) | |
| { | |
| $color = imagecolorallocate($im, 0, 0, 0); | |
| } | |
| $text = str_replace("\r\n", "\n", strtolower($text)); | |
| $posx = $x; | |
| $posy = $y; | |
| foreach (str_split($text) as $letter) | |
| { | |
| if ($letter == "\n") | |
| { | |
| $posx = $x; | |
| $posy+= 8*$size; | |
| continue; | |
| } | |
| if (!isset(self::$map[$letter])) | |
| { | |
| $map = self::$map[' ']; | |
| } | |
| else | |
| { | |
| $map = self::$map[$letter]; | |
| } | |
| $charlines = explode(',', $map); | |
| $py = (count($charlines)<7) ? 0 : -1; | |
| $charwidth = 0; | |
| foreach ($charlines as $j => $line) | |
| { | |
| foreach (str_split($line) as $i => $pixel) | |
| { | |
| if ($pixel) | |
| { | |
| imagefilledrectangle($im, | |
| $posx + $i*$size, | |
| $posy + $j*$size + $py, | |
| $posx + ($i+1+$bold)*$size - 1, | |
| $posy + ($j+1)*$size + $py - 1, | |
| $color); | |
| } | |
| } | |
| $charwidth = max($charwidth, strlen($line)); | |
| } | |
| $posx+= ($charwidth + $bold + $spacing)*$size; | |
| } | |
| } | |
| static function buildMap() | |
| { | |
| // official chars | |
| self::$map[' '] = '000'; | |
| self::$map['a'] = '001100,010010,011110,010010,010010'; | |
| self::$map['b'] = '011100,010010,011100,010010,011100'; | |
| self::$map['c'] = '001100,010010,010000,010010,001100'; | |
| self::$map['d'] = '011100,010010,010010,010010,011100'; | |
| self::$map['e'] = '01110,01000,01110,01000,01110'; | |
| self::$map['f'] = '01110,01000,01110,01000,01000'; | |
| self::$map['g'] = '001110,010000,010110,010010,001100'; | |
| self::$map['h'] = '010010,010010,011110,010010,010010'; | |
| self::$map['i'] = '010,010,010,010,010'; | |
| self::$map['j'] = '000010,000010,000010,010010,001100'; | |
| self::$map['k'] = '010010,010100,011000,010100,010010'; | |
| self::$map['l'] = '01000,01000,01000,01000,01110'; | |
| self::$map['m'] = '0100010,0110110,0101010,0100010,0100010'; | |
| self::$map['n'] = '0100010,0110010,0101010,0100110,0100010'; | |
| self::$map['o'] = '001100,010010,010010,010010,001100'; | |
| self::$map['p'] = '011100,010010,011100,010000,010000'; | |
| self::$map['q'] = '001100,010010,010010,010010,001100,000010'; | |
| self::$map['r'] = '011100,010010,011100,010100,010010'; | |
| self::$map['s'] = '001110,010000,001100,000010,011100'; | |
| self::$map['t'] = '01110,00100,00100,00100,00100'; | |
| self::$map['u'] = '010010,010010,010010,010010,001100'; | |
| self::$map['v'] = '0100010,0100010,0010100,0010100,0001000'; | |
| self::$map['w'] = '0100010,0101010,0101010,0101010,0010100'; | |
| self::$map['x'] = '0100010,0010100,0001000,0010100,0100010'; | |
| self::$map['y'] = '0100010,0010100,0001000,0001000,0001000'; | |
| self::$map['z'] = '01110,00010,00100,01000,01110'; | |
| self::$map['0'] = '001100,010010,010010,010010,001100'; | |
| self::$map['1'] = '01100,00100,00100,00100,01110'; | |
| self::$map['2'] = '011100,000010,001100,010000,011110'; | |
| self::$map['3'] = '011100,000010,001100,000010,011100'; | |
| self::$map['4'] = '010100,010100,010100,011110,000100'; | |
| self::$map['5'] = '011110,010000,011100,000010,011100'; | |
| self::$map['6'] = '001100,010000,011100,010010,001100'; | |
| self::$map['7'] = '011110,000010,000100,001000,001000'; | |
| self::$map['8'] = '001100,010010,001100,010010,001100'; | |
| self::$map['9'] = '001100,010010,001110,000010,001100'; | |
| self::$map['!'] = '010,010,010,,010'; | |
| self::$map['@'] = '0011100,0101010,0101100,0100000,0011100'; | |
| self::$map['#'] = '0010100,0111110,0010100,0111110,0010100'; | |
| self::$map['$'] = '000100,001110,010000,001100,000010,011110,001000'; | |
| self::$map['%'] = '0110100,0110100,0001000,0010110,0010110'; | |
| self::$map['^'] = '00100,01010'; | |
| self::$map['&'] = '000100,001110,010000,001100,010000,001110,00010'; | |
| self::$map['*'] = '0001000,0101010,0011100,0101010,0001000'; | |
| self::$map['('] = '0010,0100,0100,0100,0010'; | |
| self::$map[')'] = '0100,0010,0010,0010,0100'; | |
| self::$map['_'] = ',,,,,011110'; | |
| self::$map['+'] = '0001000,0001000,0111110,0001000,0001000'; | |
| self::$map['-'] = ',,01110'; | |
| self::$map['='] = ',01110,,01110'; | |
| self::$map['`'] = '0100,0010'; | |
| self::$map['['] = '0110,0100,0100,0100,0110'; | |
| self::$map[']'] = '0110,0010,0010,0010,0110'; | |
| self::$map['\\'] = '01000,01000,00100,00010,00010'; | |
| self::$map['{'] = '00110,00100,01000,00100,00110'; | |
| self::$map['}'] = '01100,00100,00010,00100,01100'; | |
| self::$map['|'] = '010,010,010,010,010,010,010'; | |
| self::$map['\''] = '010,010'; | |
| self::$map['"'] = '01010,01010'; | |
| self::$map[';'] = ',010,,010,100'; | |
| self::$map[':'] = ',10,,10'; | |
| self::$map[','] = ',,,,010,100'; | |
| self::$map['.'] = ',,,,10'; | |
| self::$map['/'] = '00010,00010,00100,01000,01000'; | |
| self::$map['<'] = '00010,00100,01000,00100,00010'; | |
| self::$map['>'] = '01000,00100,00010,00100,01000'; | |
| self::$map['?'] = '011100,000010,001100,,001000'; | |
| self::$map['~'] = '001010,010100'; | |
| // custom chars | |
| self::$map['£'] = '0001100,0010010,0010000,0111100,0010000,0010000,0111110'; | |
| self::$map['€'] = '00011100,00100010,01111100,00100000,01111100,00100010,00011100'; | |
| self::$map['¥'] = '0100010,0100010,0010100,0111110,0001000,0111110,0001000'; | |
| self::$map['µ'] = ',01010,01010,01110,01000,01000'; | |
| self::$map['§'] = '0001100,0010010,0101000,0010100,0001010,0100100,0011000'; | |
| self::$map['¤'] = '0100010,0011100,0010100,0011100,0100010'; | |
| self::$map['¹'] = '011000,001000,001000,011110,,,'; | |
| self::$map['²'] = '011100,000100,001000,011110,,,'; | |
| self::$map['³'] = '011110,001110,000010,011100,,,'; | |
| self::$map['°'] = '001100,010010,010010,001100,,,'; | |
| self::$map['÷'] = '0001000,,0111110,,0001000'; | |
| self::$map['«'] = '0001010,0010100,0101000,0010100,0001010'; | |
| self::$map['»'] = '0101000,0010100,0001010,0010100,0101000'; | |
| self::$map['¨'] = '01010'; | |
| self::$map['…'] = ',,,,0101010'; | |
| self::$map['×'] = ',01010,00100,01010'; | |
| self::$map['¶'] = '0011010,0111010,0111010,0011010,0001010,0001010,0001010'; | |
| self::$map['•'] = ',001100,011110,011110,001100'; | |
| self::$map['±'] = '0001000,0001000,0111110,0001000,0001000,0111110'; | |
| self::$map['¿'] = '000100,,001100,010000,001110'; | |
| self::$map['¡'] = '010,,010,010,010'; | |
| self::$map['¢'] = '0000010,0011100,0100110,0101000,0110010,0011100,0100000'; | |
| self::$map['¦'] = '010,010,010,,010,010,010'; | |
| self::$map['©'] = '000111000,001000100,010111010,010100010,010111010,001000100,000111000'; | |
| self::$map['®'] = '000111000,001000100,010111010,010110010,010101010,001000100,000111000'; | |
| self::$map['¯'] = '011110'; | |
| self::$map['´'] = '0010,0100'; | |
| self::$map['·'] = ',,010'; | |
| self::$map['¬'] = ',,011110,000010'; | |
| self::$map['ø'] = self::$map['Ø'] = '000000010,000111100,001001100,001010100,001100100,001111000,010000000'; | |
| self::$map['œ'] = self::$map['Œ'] = '00111110,01001000,01001110,01001000,00111110'; | |
| self::$map['æ'] = self::$map['Æ'] = '00011110,00101000,01111110,01001000,01001110'; | |
| self::$map['ß'] = '0011000,0100100,0101000,0100100,0100010,0101010,0100100'; | |
| self::$map['Ð'] = '0011100,0010010,0111010,0010010,0011100'; | |
| self::$map['þ'] = '010000,011100,010010,010010,010010,011100,010000'; | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment