Skip to content

Instantly share code, notes, and snippets.

@mistic100
Last active August 29, 2015 13:57
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mistic100/9433924 to your computer and use it in GitHub Desktop.
Save mistic100/9433924 to your computer and use it in GitHub Desktop.
[PHP] Write text on image with silkscreen font
<?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