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 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