# site: http://alphahelical.com/code/misc/pngpix # desc: pngpix was inspired by the venerable pixelgif.com. However, I like pngs # better . . . Okay, so this works best with some .htaccess voodoo. The # script needs to see a query-string like colour/transparency. You can do # URIs as script.php?colour/transparency, or script/colour/transparency. # You choose. For random colours, provide no arguments. For random colours # with specified transparency, provide a first argument != six chars, with # a second argument either hex (2 chars) or dec (3 chars) from 0 to 127 # for alpha channel. Just remember that Internet Exploder doesn't handle # png alpha channels properly. I guess MS doesn't like anything that's # free and open . . . # # Oh, this also requires that PHP be compiled with the GD library. # # todo: height/width alteration and random transparency? Easy, but I'm not sure # I'd ever use them, and I like to avoid feature creep. If you want to do # the first one, just be sure you alter the cache name to reflect size! # # Also, a cache timeout of sorts would be nice. I'll probably put that in # v0.2a . . . it'll be necessary if you serve this to the public rather # than keeping it for personal use. # # licence: pngpix is copyright 2006 Keith Beckman, and is protected by # the GNU GPL v 2.0 (http://www.gnu.org/licenses/gpl.txt). # ##################### /**** config ****/ $tempdir = '/tmp/pixelpng'; define('default_width',100); define('default_height',100); /** end config **/ /***** main *****/ header("Content-type: image/png"); if($_SERVER[QUERY_STRING] != '') { header("X-query-string: $_SERVER[QUERY_STRING]"); // here for debug, but might as well . . . } else { header("X-query-string: none"); } $colour = parseq(); $pix = makePix($colour[0],$colour[1],$colour[2],$colour[3]); header("Content-disposition: inline; filename=\"$pix[1].png\""); echo $pix[0]; /*** end main ***/ function parseq() { /* example.com/pixel/0ff00f/0f example.com/pixel/rnd/9a example.com/pixel/colour/transparency example.com/pixel?colour/transparency colour is any six-char string. other numbers of characters yield random colours */ $q = strtolower(preg_replace('/^\//','',$_SERVER['QUERY_STRING'])); $q_array = explode('/',$q); $colourlen = strlen($q_array[0]); switch(strlen($q_array[0])) { case 6: for($i=0; $i<3; $i++) { $colour[$i] = intval(substr($q_array[0],$i*2,2),16); } break; default: $colour = randColour(); header("Cache-Control: no-cache"); header("Pragma: no-cache"); } switch(strlen($q_array[1])) { case 2: $colour[] = intval($q_array[1],16); // if trans is hex break; case 3: $colour[] = intval($q_array[1],10); // if trans is dec break; } return $colour; } function randColour() { for($i=0; $i<3; $i++) { $colour[$i] = mt_rand(0,0xFF); } return $colour; } function makePix($red,$grn,$blu,$trans=0,$width=default_width,$height=default_height) { global $tempdir; $red = $red % 0x100; $grn = $grn % 0x100; $blu = $blu % 0x100; $trans = $trans % 0x80; $name = dechex($red).'-'.dechex($grn).'-'.dechex($blu).'-'.dechex($trans); if(!file_exists("$tempdir/$name.png")) { if(!is_dir($tempdir)) { mkdir($tempdir); } header("X-cached-file: false"); $pix = imagecreate($width,$height); $colour = imagecolorallocatealpha($pix,$red,$grn,$blu,$trans); imagefill($pix,0,0,$colour); imagesavealpha($pix,TRUE); imagepng($pix,"$tempdir/$name.png"); } else { header("X-cached-file: true"); } return(array(file_get_contents("$tempdir/$name.png"),$name)); } ?>